SQL Server插入到-如何识别导致截断错误的列


11

我有一个存储过程,将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。

还有更简单的选择吗?


1
我将转到INFORMATION_SCHEMA.COLUMNS并将数据类型与您要插入的数据类型进行比较。不幸的是,SQL Server没有像ORACLE那样具有用于变量声明的动态数据类型。
MguerraTorres

2
我将使用第二个选项,将其插入新的(或#temp)表中,然后比较列的长度。或者,您可以将LEN()包裹在select中的所有列周围,然后让externalquery对每个列进行MAX()...这将为您提供字段的最大文本长度。当然,假设这是给您带来麻烦的char字段。不使用smalldatetime或tinyint吗?
乔纳森·菲特

1
我会采用“选择进入”方法并比较列长,是的。也许使用“ WHERE 1 = 0”,以便表没有行。如果您的SELECT不包含所选列的唯一名称,则很尴尬。我将长列列表的格式设置为每列脚本一行,然后在需要时在下一行添加“ AS”列名称,并在四列之后添加一个空白行,以便更轻松地保留在列表中。这还支持选择许多行并执行Ctrl + K Ctrl + C将其更改为注释,因此您可以以这种方式攻击插入操作,但是省略的列必须为可为空。
罗伯特·卡内基

Answers:



9

不幸的是,您遇到了相当古老的“功能”。自2008年以来,Connect票证已经开放,而且近十年来,它还不足以保证进行修复。

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


1

将(QUERYTRACEON 460)放在查询末尾时,对我来说不起作用。

我在数据库级别将其打开,并且有效:

DBCC TRACEON(460, -1);
GO

但是,一旦发现并解决了问题,请确保将其关闭,请勿继续使用!

DBCC TRACEOFF(460, -1);
GO
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.