SQL INSERT,强制截断字段

时间:2009-01-12 16:38:41

标签: sql sql-server

我输入的数据包含一些比相应数据库字段长的“流氓”字段。这会导致我的导入脚本使用SQL INSERT语句,并发出警告:

Msg 8152, Level 16, State 13, Line 2
String or binary data would be truncated.

如何强制截断这些字段并启用我的脚本?

4 个答案:

答案 0 :(得分:10)

当您插入以下内容时执行以下操作:

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

您只会将左N个字符存储到数据库中。

答案 1 :(得分:9)

使用Ansi警告? http://msdn.microsoft.com/en-GB/library/ms190368(v=sql.110).aspx

DECLARE @TABLE TABLE
(
    Data VARCHAR(3)
)

SET ANSI_WARNINGS OFF

INSERT INTO @TABLE 
VALUES('Hello World')

SELECT * FROM @TABLE

SET ANSI_WARNINGS ON

INSERT INTO @TABLE 
VALUES('Goodbye World')

SELECT * FROM @TABLE

答案 2 :(得分:6)

我个人希望他们失败然后查看数据。我不相信你应该考虑自动截断数据。你可以通常需要让你的场地定义更大。除非您直观地检查会失败的行,否则您将无法知道。

示例:我们存储语音标题。假设你有两个头衔:
如何阅读书籍:
如何在不弄湿的情况下阅读浴缸中的书籍

现在,如果你的字段有10个字符,那么它们将被截断为相同的东西。而且他们被截断的东西甚至没有意义。两者都会说“如何Rea”现在你没有任何区别可能会有两个非常不同的标题,你所拥有的东西无论如何都是不正确的。调整字段以存储更多字符显然是正确的做法。这个例子很傻,但垃圾进去,垃圾出来。如果截断人员或其他关键数据的名称,最终会出现问题,因为您有垃圾数据。我已经看到这种情况发生在我们的语音标题,last_names,地址,电话号码和许多其他数据。如果你必须截断数据,那么你很可能无论如何都要为该记录存储无用的数据。在导入生产数据之前,数据需要正确清理(例如从电话号码中删除() - 如果您只设计存储数字),或者字段需要更大。

答案 3 :(得分:1)

我不知道比使用LEFT()跟踪它们更简单的方法。不过,我很想知道是否有。

显然,使用像INFORMATION_SCHEMA.COLUMNS这样的元数据,您可以自动确定这一点并编写脚本,以LEFT()执行相应的长度。