sql-server – 如何识别负责“字符串或二进制数据将被截断”的列.

前端之家收集整理的这篇文章主要介绍了sql-server – 如何识别负责“字符串或二进制数据将被截断”的列.前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用从远程Pg数据库写入SELECT的代码自动生成一些查询,并插入到本地sql Server数据库中.但是,其中一个正在生成错误

[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的情况下做到这一点?

解决方法

不,它没有记录在任何地方.投票并陈述您的商业案例;这是应该在sql Server中修复的长列表中的一个.

这是多年前在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的等价物.或者,因为这只意味着您将默默地丢失数据,请确定哪些列不匹配并修复目标列,以便它们适合来自源的所有数据.给定对两个系统的元数据访问,以及您已经编写了必须自动匹配源的查询的事实 – >目标列(否则这个错误几乎不是你最大的问题),你根本不需要做任何蛮力猜测.

原文链接:https://www.f2er.com/mssql/80651.html

猜你在找的MsSQL相关文章