加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:58:54 所属栏目:MsSql教程 来源:网络整理
导读:我使用从远程Pg数据库写入SELECT的代码自动生成一些查询,并插入到本地SQL Server数据库中.但是,其中一个正在生成此错误: [Microsoft][ODBC SQL Server Driver][SQL Server]String or binary data would be truncated. (SQL-22001) [state was 22001 now 0100
我使用从远程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的等价物.或者,因为这只意味着您将默默地丢失数据,请确定哪些列不匹配并修复目标列,以便它们适合来自源的所有数据.给定对两个系统的元数据访问,以及您已经编写了必须自动匹配源的查询的事实 – >目标列(否则这个错误几乎不是你最大的问题),你根本不需要做任何蛮力猜测.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读