[Microsoft][ODBC sql Server Driver][sql Server]String or binary data would be truncated. (sql-22001) [state was 22001 now 01000]
[Microsoft][ODBC sql Server Driver][sql Server]The statement has been terminated. (sql-01000) at .\insert.pl line 106.
如何找出产生该错误的列并且缺少输入的长度?有没有办法在没有蛮力猜测所有varchar的情况下做到这一点?
解决方法
这是多年前在Connect上请求的(可能是sql Server 2000或2005时间框架中的第一个),然后是新的反馈系统:
> binary or string data would be truncated => error message enhancments
现在它已于SQL Server 2019交付(并且,可能是即将推出的Azure sql数据库更新,可能会被移植到2017年和2016年的最后一个服务包,但这是我的猜测).在第一个公共CTP 2.0中,它只会出现在跟踪标志460下.这听起来有点秘密,但它发表于this Microsoft whitepaper.这是一个例子:
USE tempdb; GO CREATE TABLE dbo.x(a char(1)); INSERT dbo.x(a) VALUES('foo'); GO
在sql Server 2019之前的所有受支持版本中的结果:
Msg 8152,Level 16,State 30,Line 5
String or binary data would be truncated.
The statement has been terminated.
现在,在sql Server 2019上:
DBCC TRACEON(460); GO INSERT dbo.x(a) VALUES('foo'); GO DROP TABLE dbo.x; DBCC TRACEOFF(460);
结果显示表,列和(截断的)值:
Msg 2628,State 1,Line 11
String or binary data would be truncated in table ‘tempdb.dbo.x’,column ‘a’. Truncated value: ‘f’.
The statement has been terminated.
在您删除所有内容并升级到sql Server 2019或迁移到Azure sql数据库之前,您可以更改“自动”代码以实际从sys.columns中提取max_length,以及您必须到达那里的名称,以及然后应用LEFT(column,max_length)或PG的等价物.或者,因为这只意味着您将默默地丢失数据,请确定哪些列不匹配并修复目标列,以便它们适合来自源的所有数据.给定对两个系统的元数据访问,以及您已经编写了必须自动匹配源的查询的事实 – >目标列(否则这个错误几乎不是你最大的问题),你根本不需要做任何蛮力猜测.