当你收到这个错误时,首先要问的是,哪一列?不幸的是,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
请注意
以前有人见过这个吗?
感谢。
UPDATE:我还通过过滤掉SELECT来完成“水平”测试,结果大致相同。换句话说,如果我说
我尝试了很多种组合,但它不能局限于一行。
答案 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列。