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

ADO执行Update Or Insert语句时Insert分支无法获取Inserted返回值问题

问题根源

你的Upsert语句执行后会返回2个独立结果集:

  • 第一个结果集是UPDATE语句的OUTPUT输出,命中更新时为1行记录,未命中时为空集
  • 第二个结果集是INSERT语句的OUTPUT输出,仅触发插入时存在1行记录

TADOQuery调用Open方法后默认指向第一个结果集,因此触发插入分支时,你读取的是UPDATE返回的空集,自然拿不到自增ID。

解决方案

方案1:仅修改Delphi代码(无需调整现有SQL,推荐)

只需要增加结果集遍历逻辑,找到存在记录的结果集读取即可:

uses
  ADODB; // 需引用该单元使用ADO常量

// ... 原有代码
Query := TADOQuery.Create(nil);
Query.Connection := ADOConnection;
try
  Query.SQL.Text := sSqlText;
  Query.Open;
  
  // 遍历所有结果集
  while True do
  begin
    if Query.RecordCount > 0 then
    begin
      Memo1.Lines.Add('Ado Result: '+ Query.RecordCount.ToString + ' ~ ' +  Query.Fields[0].AsString);
      Break;
    end;
    // 跳转下一个结果集,无更多结果集时退出循环
    if Query.NextRecordset = nil then Break;
  end;
finally
  Query.Free;
end;

方案2:改用SQL Server MERGE语法实现Upsert(仅返回1个结果集)

如果可以调整SQL,使用原生MERGE语句实现Upsert更简洁,且只会返回1个结果集,原有Delphi读取逻辑无需修改:

MERGE INTO Artikel t
USING (VALUES ('TEST', '19904.S')) s (SuchBeg, ArtNr)
ON t.ArtNr = s.ArtNr
WHEN MATCHED THEN UPDATE SET t.SuchBeg = s.SuchBeg
WHEN NOT MATCHED THEN INSERT (SuchBeg, ArtNr) VALUES (s.SuchBeg, s.ArtNr)
OUTPUT INSERTED.IndexField;

内容的提问来源于stack exchange,提问作者Quelltextknecht

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:03