SQL插入,强制截断字段

SQL插入,强制截断字段,sql,sql-server,Sql,Sql Server,我的输入数据包含一些比相应数据库字段长的“rogue”字段。这会导致使用SQL INSERT语句的导入脚本崩溃,并出现警告: Msg 8152, Level 16, State 13, Line 2 String or binary data would be truncated. 如何强制截断这些字段并使脚本得以完成?当您插入时,请执行以下操作: INSERT INTO Table1('Column1') VALUES(LEFT(RTRIM(InputField), MaxLength))

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

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

如何强制截断这些字段并使脚本得以完成?

当您插入时,请执行以下操作:

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

您将只将剩下的N个字符存储到数据库。

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


显然,使用元数据,如
信息\u SCHEMA.COLUMNS
,您可以自动确定这一点,并编写脚本,将
LEFT()
设置为适当的长度。

我个人希望它们失败,然后查看数据。我不认为你应该考虑数据的自动截断。实际上,您可能需要扩大字段定义。除非您目视检查将失败的行,否则您不会知道

示例:我们存储演讲标题。假设您有两个标题:
如何读书:
如何在浴缸里看书而不把书弄湿

现在,如果您的字段有10个字符,那么这两个字符都将被截断为相同的内容。此外,他们被截断的内容甚至毫无意义。两人都会说“如何反应”,现在你没有什么不同了,因为有两个完全不同的标题,而且你所拥有的并不正确。调整字段以存储更多字符显然是正确的做法。这个例子很傻,但垃圾进来,垃圾出去。如果截断人名或其他关键数据,最终会出现问题,因为您有垃圾数据。我在我们的演讲题目、姓氏、地址、电话号码和许多其他数据中看到过这种情况。如果您必须截断数据,那么很可能您正在为该记录存储无用的数据。在导入到生产数据之前,数据需要正确清理(例如从电话号码中删除()-如果您只存储电话号码),或者字段需要更大。

是否使用Ansi警告


谢谢你,伙计,这已经足够好了(即使它涉及到修改所有相关的导入语句)。+1,但你也可以在结尾说:“如果你真的需要,使用LEFT()”你试过转换成特定长度的varchar吗?如果长度大于规定长度,则会切断末端。在某些情况下,这种“创可贴”解决方案可能会很有用。不过,我还是同意了。这是危险的使用定期,只是作为一个非常快速和肮脏的黑客,不应该去附近的生产环境。
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