我参与了一个数据迁移项目。当我试图将数据从一个表插入到另一个表(SQL Server 2005)时,我得到以下错误:
编号8152,16层,状态13,1线 字符串或二进制数据将被截断。
源数据列与数据类型匹配,并且在目标表列的长度定义内,因此我不知道是什么原因导致了这个错误。
我参与了一个数据迁移项目。当我试图将数据从一个表插入到另一个表(SQL Server 2005)时,我得到以下错误:
编号8152,16层,状态13,1线 字符串或二进制数据将被截断。
源数据列与数据类型匹配,并且在目标表列的长度定义内,因此我不知道是什么原因导致了这个错误。
当前回答
我今天遇到了这个问题,在我搜索这个信息量最小的错误消息的答案时,我还发现了这个链接:
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,并设法查明问题之一,看到字符串太长,增加该列的大小,然后大导入文件运行没有问题。
这是一种破解和变通方法,但当你别无选择时,你只能做你能做的。
其他回答
对于其他的,也检查您的存储过程。在我的例子中,在我的存储过程CustomSearch中,我不小心声明了我的列没有足够的长度,所以当我输入一个大数据时,我收到了这个错误,尽管我的数据库中有很大的长度。我只是在自定义搜索中改变了列的长度错误就消失了。这只是为了提醒大家。谢谢。
我在表创建上使用空字符串,然后在后续更新中接收错误'Msg 8152,字符串或二进制数据将被截断'。发生这种情况是因为更新值包含6个字符,并且比预期的列定义大。我使用“SPACE”来解决这个问题,只是因为我知道我将在初始数据创建后批量更新,即列不会长时间保持空。
这里有个大警告:这不是一个特别巧妙的解决方案,但在你把一个数据集放在一起的情况下很有用,例如,对于一次性的情报请求,你要为数据挖掘创建一个表,应用一些批量处理/解释,并存储结果前后,以便以后比较/挖掘。这是我这一行经常发生的事。
最初可以使用SPACE关键字进行填充。
select
Table1.[column1]
,Table1.[column2]
,SPACE(10) as column_name
into table_you_are_creating
from Table1
where ...
随后将允许对“column_name”进行10个字符或更少的后续更新(如适用可替换),而不会导致截断错误。同样,我只会在类似于我的警告中描述的场景中使用它。
是的,我也面临着这样的问题。
REMARKS VARCHAR(500)
to
REMARKS VARCHAR(1000)
在这里,我将备注文件的长度从500更改为1000
请尝试以下代码:
CREATE TABLE [dbo].[Department](
[Department_name] char(10) NULL
)
INSERT INTO [dbo].[Department]([Department_name]) VALUES ('Family Medicine')
--error will occur
ALTER TABLE [Department] ALTER COLUMN [Department_name] char(50)
INSERT INTO [dbo].[Department]([Department_name]) VALUES ('Family Medicine')
select * from [Department]
是的,“一品脱的酒放进半品脱的锅里是不行的”。我对人们建议的各种sp没有太多的运气(无论出于什么原因),但只要两个表在同一个DB中(或者您可以将它们放到同一个DB中),您就可以使用INFORMATION_SCHEMA。列来定位错误字段,因此:
select c1.table_name,c1.COLUMN_NAME,c1.DATA_TYPE,c1.CHARACTER_MAXIMUM_LENGTH,c2.table_name,c2.COLUMN_NAME, c2.DATA_TYPE,c2.CHARACTER_MAXIMUM_LENGTH
from [INFORMATION_SCHEMA].[COLUMNS] c1
left join [INFORMATION_SCHEMA].[COLUMNS] c2 on
c1.COLUMN_NAME=c2.COLUMN_NAME
where c1.TABLE_NAME='MyTable1'
and c2.TABLE_NAME='MyTable2'
--and c1.DATA_TYPE<>c2.DATA_TYPE
--and c1.CHARACTER_MAXIMUM_LENGTH <> c2.CHARACTER_MAXIMUM_LENGTH
order by c1.COLUMN_NAME
这将允许您上下滚动,比较字段的长度。注释的部分可以让您查看(显然是在未注释的情况下)是否存在数据类型不匹配,或者特别显示字段长度不同的数据类型(因为我懒得滚动),只需注意,所有内容都基于与目标列名匹配的源列名。