Eva*_*oll 42 sql-server-2008 sql-server
我正在使用我从远程 Pg 数据库写入 SELECT 的代码自动生成一些查询,并插入到本地 SQL Server 数据库中。但是,其中之一正在生成此错误:
[Microsoft][ODBC SQL Server 驱动程序][SQL Server]字符串或二进制数据将被截断。(SQL-22001) [状态是 22001 现在是 01000]
[Microsoft][ODBC SQL Server Driver][SQL Server]语句已终止。(SQL-01000) 在 .\insert.pl 第 106 行。
我如何找出哪个列产生了该错误并且缺少输入的长度?有没有办法做到这一点而不用蛮力猜测所有varchar
?
Aar*_*and 42
不,它没有记录在任何地方。去投票并陈述你的商业案例;这是应该在 SQL Server 中修复的一长串事情之一。
这是多年前在 Connect 上提出的要求(可能首先是在 SQL Server 2000 或 2005 时间范围内),然后又在新的反馈系统上提出:
现在它已提供以下版本:
在 SQL Server 2019 的第一个公开 CTP 中,它只出现在跟踪标志 460 下。这听起来有点秘密,但它已在这份 Microsoft 白皮书中发布。这将是未来的默认行为(不需要跟踪标志),尽管您将能够通过新的数据库范围配置来控制它VERBOSE_TRUNCATION_WARNINGS
。
下面是一个例子:
USE tempdb;
GO
CREATE TABLE dbo.x(a char(1));
INSERT dbo.x(a) VALUES('foo');
GO
Run Code Online (Sandbox Code Playgroud)
导致 SQL Server 2019 之前的所有受支持版本:
消息 8152,级别 16,状态 30,第 5 行
字符串或二进制数据将被截断。
该语句已终止。
现在,在 SQL Server 2019 CTP 上,启用跟踪标志:
DBCC TRACEON(460);
GO
INSERT dbo.x(a) VALUES('foo');
GO
DROP TABLE dbo.x;
DBCC TRACEOFF(460);
Run Code Online (Sandbox Code Playgroud)
结果显示表、列和(截断的,不完整的)值:
消息 2628,级别 16,状态 1,第 11 行
字符串或二进制数据将在表“tempdb.dbo.x”的“a”列中被截断。截断值:'f'。
该语句已终止。
在您可以移动到受支持的版本/CU 或移动到 Azure SQL 数据库之前,您可以更改“自动”代码以实际从 中提取 max_lengthsys.columns
以及无论如何必须到达的名称,然后应用LEFT(column, max_length)
或其他PG 的等价物是。或者,因为这只是意味着您将无声地丢失数据,请找出不匹配的列并修复目标列,以便它们适合来自源的所有数据。考虑到对两个系统的元数据访问,以及您已经在编写一个必须自动匹配源 -> 目标列的查询的事实(否则这个错误几乎不会成为您最大的问题),您不应该做任何蛮力完全在猜测。