SQL插入,强制截断字段

10

我有一些输入数据,其中包含一些比相应数据库字段更长的“捣蛋”字段。这会导致我的导入脚本(使用SQL INSERT语句)出现警告并失败:

Msg 8152, Level 16, State 13, Line 2
String or binary data would be truncated.
如何强制截断这些字段并使我的脚本能够完成?

你尝试将其转换为特定长度的varchar类型吗?如果超过指定的长度,它会截断末尾。 - TheTXI
4个回答

14

当你插入时,可以执行类似以下操作:

INSERT INTO Table1('Column1') VALUES(LEFT(RTRIM(InputField), MaxLength))

你只会把左边的N个字符存储到数据库中。


谢谢,伙计。这已经足够好了(尽管它涉及修改所有相关的导入语句)。 - Ben Aston

13

3
在某些情况下,这种“临时解决方案”可能会有用。但是要小心谨慎。 - Clay Horste
同意。这是危险的,仅仅作为一种非常快速和肮脏的hack使用,不应该在任何生产环境中使用。 - NumericOverflow

7
个人而言,我希望它们失败,然后查看数据。我认为您永远不应该考虑自动截断数据。您可能需要将字段定义扩大。除非您直观地检查将会失败的行,否则您不会知道。
例如:我们存储演讲标题。假设您有两个标题:
如何阅读一本书:
如何在浴缸中阅读书籍而不弄湿它

现在,如果您的字段有10个字符,两者都将被截断为相同的内容。而且,它们被截断后的东西甚至没有意义。两者都会显示“如何Rea”,现在你无法区分两个非常不同的标题,而且你所拥有的信息也不正确。显然,调整字段以存储更高数量的字符是正确的做法。这个例子很愚蠢,但是有垃圾输入就有垃圾输出。如果你截断了人名或其他关键数据的名称,你最终会遇到问题,因为你有了垃圾数据。我曾见过这种情况发生在我们的演讲标题、姓氏、地址、电话号码和其他许多数据上。如果您必须截断数据,则很可能在该记录中存储无用数据。在将数据导入生产数据之前,数据需要进行正确的清理(例如,如果您仅设计存储电话号码,则需删除“() -”),或者该字段需要更大。

1
+1,但你也可以在最后加上:“如果你真的需要,使用LEFT()”。 - jcollum

1

我不知道除了查找和使用LEFT()之外是否有更简单的方法。不过如果有的话,我很想知道。

显然,使用元数据如INFORMATION_SCHEMA.COLUMNS,你可以自动确定这个长度,并将其脚本化以执行相应长度的LEFT()操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接