使用OPENQUERY删除DB2 i Series数据报错:键列信息不足或不正确
解决DB2 i Series链接服务器删除数据的报错问题
报错信息“键列信息不足或不正确。受更新影响的行数过多”,本质是SQL Server无法通过当前查询结果精准定位DB2表中要删除的行,核心原因:
- OPENQUERY仅返回FIELD1列,而该列不是LIBRARY1.FILE1的唯一键/主键,无法唯一标识单一行
- #DLT_FILE1可能存在重复数据,导致关联后匹配行数远超预期
可行解决方案:
1. 补充唯一标识列到OPENQUERY查询中
DB2内置的ROWID是唯一行标识,将其加入查询后,SQL Server可精准定位要删除的行:
DELETE FROM DB2 FROM OPENQUERY(TEST1, 'SELECT FIELD1, ROWID FROM LIBRARY1.FILE1') DB2 INNER JOIN #DLT_FILE1 DLT ON DB2.FIELD1 = DLT.FIELD1
如果表有自定义主键,也可替换ROWID为主键列组合,效果一致。
2. 将删除逻辑直接推送到DB2端执行
通过EXECUTE AT命令让DB2服务器直接处理删除操作,避免跨服务器行定位问题:
-- 拼接要删除的FIELD1值列表(适用于SQL Server 2017+) DECLARE @FieldList NVARCHAR(MAX) SELECT @FieldList = STRING_AGG(CAST(FIELD1 AS NVARCHAR(100)), ''',''') FROM #DLT_FILE1 -- 推送删除命令到DB2服务器 IF @FieldList IS NOT NULL EXECUTE ('DELETE FROM LIBRARY1.FILE1 WHERE FIELD1 IN (''' + @FieldList + ''')') AT TEST1
SQL Server 2016及以下版本,可使用STUFF+FOR XML PATH替代STRING_AGG完成字符串拼接。
3. 清理临时表重复数据
如果#DLT_FILE1存在重复的FIELD1值,先去重再关联删除,减少匹配行数:
DELETE FROM DB2 FROM OPENQUERY(TEST1, 'SELECT FIELD1 FROM LIBRARY1.FILE1') DB2 INNER JOIN (SELECT DISTINCT FIELD1 FROM #DLT_FILE1) DLT ON DB2.FIELD1 = DLT.FIELD1
内容的提问来源于stack exchange,提问作者bmiguelh
相关产品推荐
相关产品推荐

