sql-server – 如何识别负责“字符串或二进制数据将被截断”的列
我使用从远程Pg数据库写入SELECT的代码自动生成一些查询,并插入到本地SQL Server数据库中.但是,其中一个正在生成此错误:
如何找出产生该错误的列并且缺少输入的长度?有没有办法在没有蛮力猜测所有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之前的所有受支持版本中的结果:
现在,在SQL Server 2019上: DBCC TRACEON(460); GO INSERT dbo.x(a) VALUES('foo'); GO DROP TABLE dbo.x; DBCC TRACEOFF(460); 结果显示表,列和(截断的)值:
在您删除所有内容并升级到SQL Server 2019或迁移到Azure SQL数据库之前,您可以更改“自动”代码以实际从sys.columns中提取max_length,以及您必须到达那里的名称,以及然后应用LEFT(column,max_length)或PG的等价物.或者,因为这只意味着您将默默地丢失数据,请确定哪些列不匹配并修复目标列,以便它们适合来自源的所有数据.给定对两个系统的元数据访问,以及您已经编写了必须自动匹配源的查询的事实 – >目标列(否则这个错误几乎不是你最大的问题),你根本不需要做任何蛮力猜测. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |