gpt4 book ai didi

sql-server - 如果执行带返回值的 SQL 语句,则游标不返回查询

转载 作者:行者123 更新时间:2023-12-03 08:16:01 24 4
gpt4 key购买 nike

使用 DBExpress 和 Delphi XE 执行以下查询时遇到问题。我需要从执行的查询中获取最后一个身份 ID:

function TServerDBUtils.ExecuteQueryWithIdentity(ASQLConn: TSQLConnection): Integer;
var
newSQLQuery: TSQLQuery;
begin
Result := -1;
newSQLQuery := TSQLQuery.Create(nil);
try
with newSQLQuery do
begin
SQLConnection := ASQLConn;

SQL.Clear;
SQL.Add('Insert into SampleTable(uomname) values(' + Quotedstr('bag') +')';

SQL.Add('Select Scope_Identity()');
Open;
Result:= Fields[0].AsInteger;
end;
finally
FreeAndNil(newSQLQuery);
end;
end;

我收到错误“光标未返回查询”。我以前使用过同样的方法,使用 FireDac 和 Delphi XE5 并且没有错误。不,我想知道在 DBExpress 中是否不允许“开放”做这样的事情。我应该使用什么方法? (我们必须在我们的项目中使用 DBExpress)
我试过这个:
function TServerDBUtils.ExecuteQueryWithIdentity(ASQLConn: TSQLConnection): Integer;
var
newSQLQuery: TSQLQuery;
begin
Result := -1;
newSQLQuery := TSQLQuery.Create(nil);
try
with newSQLQuery do
begin
SQLConnection := ASQLConn;

SQL.Clear;
SQL.Add('Insert into SampleTable(uomname) values(' + Quotedstr('bag') +')';
ExecSQL;

SQL.Clear;
SQL.Add('Select Scope_Identity()');
Open;
Result:= Fields[0].AsInteger;
end;
finally
FreeAndNil(newSQLQuery);
end;
end;

并且总是得到空值,可能是因为不同的 session 。
抱歉我的英语不好,并提前感谢您的帮助。

更新 :
如果我们使用 @@identity ,它会起作用:
SQL.Add('Insert into SampleTable(uomname) values(' + Quotedstr('bag') +')';
ExecSQL;

SQL.Clear;
SQL.Add('Select @@Identity');
Open;
Result:= Fields[0].AsInteger;

但是,正如 SQLServer 所说,如果在该表上触发了触发器(在插入时),则返回值是插入触发器的表的最后一个 ID。

最佳答案

SQL-Server 上最优雅的方法可能是使用
OUTPUT Clause
在多部分插入的情况下,它不仅能够返回一个 ID,而且还能够返回所有新生成的 ID。

INSERT into aTable (aField)
OUTPUT Inserted.ID
Values ('SomeValue')

如果您的表上有触发器,则必须为 OUTPUT 定义目标表
DECLARE @tmp table (ID int)
INSERT into aTable (aField)
OUTPUT Inserted.ID into @tmp
Values ('SomeValue')
Select * from @tmp

另一个建议是使用参数而不是硬编码值。

使用 TSQLQuery 添加 SET NOCOUNT ON之前的声明将阻止 cursor not returned query错误并提供预期的结果:
begin
SQLQuery1.SQL.text :='SET NOCOUNT ON'
+#13#10'DECLARE @tmp table (ID int)'
+#13#10'INSERT into aTable (aField)'
+#13#10'OUTPUT Inserted.ID into @tmp'
+#13#10'Values (:P)'
+#13#10'Select * from @tmp';
SQLQuery1.Params.ParamByName('P').Value := 'SomeText';
SQLQuery1.Open;
Showmessage(SQLQuery1.Fields[0].asString);
end;

关于sql-server - 如果执行带返回值的 SQL 语句,则游标不返回查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26457659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com