我输入的数据包含一些比相应数据库字段长的“流氓”字段。这会导致我的导入脚本使用SQL INSERT语句,并发出警告:
Msg 8152, Level 16, State 13, Line 2
String or binary data would be truncated.
如何强制截断这些字段并启用我的脚本?
答案 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()
执行相应的长度。