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
相关产品推荐
相关产品推荐

