Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么SQL MERGE语句会产生截断错误或溢出错误?_Sql_Sql Server_Tsql - Fatal编程技术网

为什么SQL MERGE语句会产生截断错误或溢出错误?

为什么SQL MERGE语句会产生截断错误或溢出错误?,sql,sql-server,tsql,Sql,Sql Server,Tsql,想象一下下面的tblVendor表: SourceSystemID (FK, tinyint, not null) VendorIDInt (int, null) VendorID (varchar(255), not null) VendorName (varchar(50), null) 下面是一个试图将源表与my TblEndor表合并的块(使用tblSourceSystem表): tblVendor表最初设计用于源的VENDOR_键varchar在遇到数据之前始终转换为int。现在这是

想象一下下面的tblVendor表:

SourceSystemID (FK, tinyint, not null)
VendorIDInt (int, null)
VendorID (varchar(255), not null)
VendorName (varchar(50), null)
下面是一个试图将源表与my TblEndor表合并的块(使用tblSourceSystem表):

tblVendor表最初设计用于源的VENDOR_键varchar在遇到数据之前始终转换为int。现在这是不可持续的,因为VENDOR_KEY的varchar溢出了VendorIDInt列

消息248,16级,状态1,第524行
varchar值“89617719042”的转换溢出了一个int列

首先,我尝试将VendorIDInt列类型更改为bigint,然后将VENDOR_键转换为bigint。正如错误显示的那样,这不起作用

Msg 8152,第16级,第14状态,第524行
字符串或二进制数据将被截断。声明已终止

第二次尝试,我修改了tblVendor以添加vendoridvarchar类型列,同时注释掉上面涉及casting和VendorIDInt的merge语句中的行。我的想法是,当我可以将数据传递到新的varchar VendorID列时,为什么还要使用VendorIDInt列呢?这也没用

Msg 8152,第16级,第14状态,第524行
字符串或二进制数据将被截断。声明已终止

我收到了同样的错误

第三次尝试时,我没有什么想法,只是按原样运行上面的merge语句,没有任何注释,试图提取数据,同时保留VendorIDInt和VendorID列。再一次,同样的截断错误。这并不奇怪

为什么同样的截断错误会一再出现

最终目标是将数据从源表获取到我的表,然后显示int列溢出错误或截断错误。我陷入了似乎不可能的境地


还有什么其他的前进道路?谢谢

出现截断错误的原因是同义词表的供应商名称列包含超过50个字符的记录

使用以下命令后,错误消失:

LEFT(VENDOR_NAME, 50)
我用来解决这个问题的方法是逐个注释并隔离每个列,然后反复运行合并


我知道这是一种暴力手段。如果有人遇到这样的问题,请随时发布更有效的策略。

SYN_VENDOR_a表上有触发器吗?您显示了
tblVendor
的架构,但没有显示
SYN_VENDOR
的架构,我不知道该同义词表上有任何触发器。如果您使用的是SQL Server 2012,请尝试向合并条件,如和TRY\u CONVERT(INT,SOURCE.VENDOR\u KEY)不为空
LEFT(VENDOR_NAME, 50)