You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:20:33