SQL Server Insert Into - 如何识别导致截断错误的列

Jua*_*lez 11 sql-server stored-procedures t-sql sql-server-2014

我有一个将 650 个字段插入表中的存储过程。插入失败并出现截断错误。

这是一个简单的

INSERT INTO
SELECT (a bunch of fields) 
FROM (a bunch of tables)
Run Code Online (Sandbox Code Playgroud)

下面是错误信息:

消息 8152,级别 16,状态 14,过程 DSP_Procedure,第 1075 行 字符串或二进制数据将被截断。

有没有一种快速的方法可以识别导致截断错误的字段?

要插入表中的 select 语句有 650 个字段,因此很难确定哪个字段导致了截断错误。

我想我可以一次注释掉字段块,以便 SP 一次只插入 100 个字段,然后运行 ​​SP 6 或 7 个不同的时间,直到我至少可以缩小到一组 100 个字段这将包含导致截断错误的字段。

或者,我在想,也许我可以只创建SELECT INTO一个新表,然后将表中的数据长度与我尝试插入到我的 SP 中的目标表的数据长度进行比较,以查看哪个字段包含比预期更长的字段长度。 ..

我正在使用 SQL Server 2014。

有没有更简单的替代品?

von*_*ryz 9

不幸的是,您遇到了一个相当古老的“功能”。自 2008 年以来一直有一个 Connect 票证开放,近十年来,这还不足以保证修复。

标准的解决办法是,像你想通,一个select into...接着比对表的元数据。另一种可能性是对违规列进行二进制搜索,但这也是手动工作。元数据比较有一些技巧,但不存在简单、优雅的解决方案。也许一些第三方工具会有所帮助,但我不知道。


小智 4

如果您使用的是 SQL Server 2016(SP2、CU6 或更高版本),一种选择是打开跟踪标志 460,例如(QUERYTRACEON 460)。输出将指示列和违规数据。

有关详细信息,请参阅这篇文章。 https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/

如果您不关心截断,您可以使用SET ANSI_WARNINGS OFF忽略该类型的截断。