字符串或二进制数据将被截断 - 海森堡问题

时间:2010-03-11 22:01:56

标签: sql-server-2005

当你收到这个错误时,首先要问的是,哪一列?不幸的是,SQL Server在这里没有帮助。所以你开始做试验和错误。好吧,现在我有一个声明:

INSERT tbl (A, B, C, D, E, F, G)
SELECT A, B * 2, C, D, E, q.F, G
  FROM tbl
      ,othertable q
 WHERE etc etc

请注意

  • 某些值是从另一个表中修改或链接的,但是大多数值都来自来自原始表,因此它们不能真正导致截断返回到同一个字段(我知道的)。
  • 一次消除一个字段最终会导致错误消失,如果我累积它,但是 - 这里是踢球者 - 我消除哪个字段无关紧要。这就好像SQL Server反对行的总长度,我怀疑,因为总共只有大约40个字段,并没有什么大的。

以前有人见过这个吗?

感谢。

UPDATE:我还通过过滤掉SELECT来完成“水平”测试,结果大致相同。换句话说,如果我说

  • WHERE id BETWEEN 1和100:错误
  • WHERE id BETWEEN 1和50:没有错误
  • WHERE id BETWEEN 50和100:没有错误

我尝试了很多种组合,但它不能局限于一行。

6 个答案:

答案 0 :(得分:5)

虽然表没有键,约束,索引或触发器,但它确实有统计信息,并且存在问题。我使用这个脚本

杀死了所有表的统计数据

http://sqlqueryarchive.blogspot.com/2007/04/drop-all-statistics-2005.html

而且瞧瞧,INSERT恢复正常运行。为什么统计信息会导致此错误?我不知道,但这是另一个问题...

更新:即使删除了统计信息,也会出现此错误。因为我确信消息本身不准确(没有截断的证据),所以我选择了this solution

SET ANSI_WARNINGS OFF
INSERT ...
SET ANSI_WARNINGS ON

好吧,它更像是一个黑客而不是一个解决方案,但它允许我 - 并希望其他人 - 转向其他事情。

答案 1 :(得分:1)

是否有理由不能简单地将字段转换为目标列的结构等效项,如下所示:

Select Cast(A as varchar(42))
, Cast(B * 2 as Decimal(18,4))
, Cast(C As varchar(10))
...
From Table

这种方法的缺点是它将截断文本值的字符限制。但是,如果你“确定”不会发生这种情况,那么就不会有任何伤害。

答案 2 :(得分:1)

在某些情况下,如果您的任何其他列具有可能导致问题的默认值,则可能会遇到问题。

实施例。您可能已添加一列来跟踪创建该行的用户,例如USER_ENTERED,其默认值为suser_sname(),但列长度小于当前用户名。

答案 3 :(得分:0)

如果它看起来像“总长度”,那么你是否有审计触发器连接用于记录的列?

编辑:更新后,我真的会考虑你有一个触发器导致这个......

在看到统计信息回答后编辑2 ...

因为总统计属性属性长度可能大于900 bytes? 不确定这是否适用于统计数据,但我不相信。

请您参考,因为我想知道为什么统计数据只是二进制直方图(IIRC)时会截断

答案 4 :(得分:0)

是的,当我遇到这个时,我不得不创建另一个模仿当前结构的表/表。然后,我没有更改代码,但是将每个字段的数据类型大小更改为所有nvarchar(MAX),直到它停止,然后逐个删除它们。是的,拖延了,但我在尝试其他任何事情时遇到了重大问题。一旦我尝试了一堆引起太多头疼的事情,我就决定采取“洞穴人”方法,因为我们后来笑了。

此外,我也看到了与FK类似的问题,你必须问:

有哪些关键限制?有没有?

由于没有,请尝试这个人的DataMgr组件:

http://www.bryantwebconsulting.com/blog/index.cfm/2005/11/21/truncated

同时检查一下:

http://forums.databasejournal.com/showthread.php?t=41969

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=138456

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=97349

您还可以将正在选择的表转储到临时表,如果错误输出到临时表,则找出哪个行给出错误。

它应该告诉你错误中的一行,如果你将每一列放在另一条线上,它应该告诉你它究竟在哪里轰炸。

答案 5 :(得分:0)

SQL Server 2005中存在最大行大小限制。请参阅here

大多数情况下,你会遇到很多nvarchar列。