我参与了一个数据迁移项目。当我试图将数据从一个表插入到另一个表(SQL Server 2005)时,我得到以下错误:

编号8152,16层,状态13,1线 字符串或二进制数据将被截断。

源数据列与数据类型匹配,并且在目标表列的长度定义内,因此我不知道是什么原因导致了这个错误。


当前回答

如果你使用的是SQL Server 2016-2017: 要修复此问题,请打开跟踪标志460

DBCC TRACEON(460, 1);
GO

确保你在以下情况下将其关闭:

DBCC TRACEOFF(460, 1);
GO

其他回答

当您没有足够的权限时,也会发生这种情况

对于其他的,也检查您的存储过程。在我的例子中,在我的存储过程CustomSearch中,我不小心声明了我的列没有足够的长度,所以当我输入一个大数据时,我收到了这个错误,尽管我的数据库中有很大的长度。我只是在自定义搜索中改变了列的长度错误就消失了。这只是为了提醒大家。谢谢。

我今天遇到了这个问题,在我搜索这个信息量最小的错误消息的答案时,我还发现了这个链接:

https://connect.microsoft.com/SQLServer/feedback/details/339410/please-fix-the-string-or-binary-data-would-be-truncated-message-to-give-the-column-name

所以微软似乎没有计划在短时间内扩展错误信息。

所以我转向了其他方法。

我把错误复制到excel中:

(1行受影响)

(1行受影响)

(1行受影响) 编号8152,16层,14号状态,13行 字符串或二进制数据将被截断。 声明已终止。

(1行受影响)

计算excel中的行数,接近导致问题的记录计数器…调整我的导出代码打印出SQL接近它…然后运行5 - 10个SQL插入问题SQL,并设法查明问题之一,看到字符串太长,增加该列的大小,然后大导入文件运行没有问题。

这是一种破解和变通方法,但当你别无选择时,你只能做你能做的。

我也遇到过类似的问题。我将数据从一个表复制到一个完全相同的表,除了名称。

最后,我使用SELECT into语句将源表转储到临时表中。

SELECT *
INTO TEMP_TABLE
FROM SOURCE_TABLE;

我比较了源表和临时表的模式。我发现其中一列是varchar(4000),而我期待的是varchar(250)。

更新: 如果你感兴趣,varchar(4000)问题可以在这里解释:

对于Nvarchar(Max),我只能在TSQL中获得4000个字符?

希望这能有所帮助。

这里有一个稍微不同的答案。您的列名和长度可能都匹配,但可能您在SELECT语句中以错误的顺序指定了列。假设tableX和tableY的列名称相同,但顺序不同