我有一个将 650 个字段插入到表中的存储过程。插入因截断错误而失败。
这是一个简单的
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
以下是错误消息:
消息 8152,级别 16,状态 14,过程 DSP_Procedure,第 1075 行字符串或二进制数据将被截断。
有没有一种快速的方法可以识别导致截断错误的字段?
要插入到表中的 select 语句有 650 个字段,这一事实使得很难确定哪个字段导致了截断错误。
我想我可以一次注释掉字段块,以便让 SP 一次插入 100 个字段,然后运行 SP 6 或 7 个不同的时间,直到我至少可以缩小到一组 100 个字段这将包含导致截断错误的字段。
或者,我在想,也许我可以只是SELECT INTO
一个新表,然后比较表中的数据长度与我试图在我的 SP 中插入的目标表的数据长度,以查看哪个字段包含比预期更长的字段长度。 ..
我正在使用 SQL Server 2014。
有更简单的选择吗?
不幸的是,您遇到了相当古老的“功能”。自 2008 年以来一直存在 Connect 票证,近十年来,这还不足以保证修复。
标准的解决方法是,就像您想的那样,
select into...
然后比较表元数据。另一种可能性是对有问题的列进行二进制搜索,但这也是手动工作。元数据比较有一些技巧,但不存在简单、优雅的解决方案。也许一些第三方工具会有所帮助,但我不知道。如果您使用的是 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
忽略该类型的截断。将 (QUERYTRACEON 460) 放在查询末尾时对我不起作用。
我在数据库级别打开它并且它工作:
但是,一旦发现并解决了问题,请确保将其关闭,不要将其打开!