Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么不是';t SCOPE_IDENTITY()是否返回插入的ID?_Sql Server_Last Insert Id_Scope Identity - Fatal编程技术网

Sql server 为什么不是';t SCOPE_IDENTITY()是否返回插入的ID?

Sql server 为什么不是';t SCOPE_IDENTITY()是否返回插入的ID?,sql-server,last-insert-id,scope-identity,Sql Server,Last Insert Id,Scope Identity,我有一个insert语句,通过ADODB.Connection.Execute插入MSSQL服务器上具有标识列的表,但返回的记录集不返回新插入记录的ID 我尝试了以下形式来获取记录的插入ID INSERT INTO blah VALUES (blah); SELECT SCOPE_IDENTITY() INSERT INTO blah VALUES (blah); SELECT @@IDENTITY INSERT INTO blah OUTPUT INSERTED.ID INTO @ID VAL

我有一个insert语句,通过
ADODB.Connection.Execute
插入MSSQL服务器上具有标识列的表,但返回的记录集不返回新插入记录的ID

我尝试了以下形式来获取记录的插入ID

INSERT INTO blah VALUES (blah); SELECT SCOPE_IDENTITY()
INSERT INTO blah VALUES (blah); SELECT @@IDENTITY
INSERT INTO blah OUTPUT INSERTED.ID INTO @ID VALUES(blah); SELECT ID FROM @ID
在所有情况下,查询返回的记录集时,该记录集不包含标识

var I = DB.Execute(insert_statement_from_above);
if (I) {
  var INSERTED_ID = I(0).Value;
}

为什么会发生这种情况?

检查正在插入的表中是否有任何插入触发器,并检查这些插入触发器是否正在使用SET NOCOUNT ON

当触发器未指定SET NOCOUNT ON时,如果它更新数据库,它将生成一个结果集,该结果集将显示在包含范围标识结果的结果集之前

见:

实际上,发生的情况是记录集包含一个或多个结果集

TRIGGER RESULT SET
SCOPE_IDENTITY RESULT SET
在查询记录集的作用域标识时,实际上是在查询触发器输出的结果集

您可以使用
RS.nextRecordset()
然后查询
范围标识
,但是如果触发器可能执行更新,您最终不知道哪个结果集包含您的
范围标识
,是第一个还是第二个,是否有第二个

对于触发器来说,通常公认的良好做法是指定
SET NOCOUNT ON
,但是如果您必须在触发器中设置
SET NOCOUNT OFF
,或者无法控制触发器,则可以使用以下代码来解决此问题

注意:上述示例中的范围标识将始终是记录集中的最后一个结果集。因此,我们可以发现如下:

var I = DB.Execute(insert_statement_from_above);
if (I) {
  // find the result set with the scope identity in it
  while (I.State == 0) {
    I = I.nextRecordset();
  }
  var INSERTED_ID = I(0).Value;
}
这将通过忽略先前关闭的结果集来查找包含范围标识的结果集

TRIGGER RESULT SET
SCOPE_IDENTITY RESULT SET
另见:


检查要插入的表中是否有任何插入触发器,并检查这些插入触发器是否正在使用SET NOCOUNT ON

当触发器未指定SET NOCOUNT ON时,如果它更新数据库,它将生成一个结果集,该结果集将显示在包含范围标识结果的结果集之前

见:

实际上,发生的情况是记录集包含一个或多个结果集

TRIGGER RESULT SET
SCOPE_IDENTITY RESULT SET
在查询记录集的作用域标识时,实际上是在查询触发器输出的结果集

您可以使用
RS.nextRecordset()
然后查询
范围标识
,但是如果触发器可能执行更新,您最终不知道哪个结果集包含您的
范围标识
,是第一个还是第二个,是否有第二个

对于触发器来说,通常公认的良好做法是指定
SET NOCOUNT ON
,但是如果您必须在触发器中设置
SET NOCOUNT OFF
,或者无法控制触发器,则可以使用以下代码来解决此问题

注意:上述示例中的范围标识将始终是记录集中的最后一个结果集。因此,我们可以发现如下:

var I = DB.Execute(insert_statement_from_above);
if (I) {
  // find the result set with the scope identity in it
  while (I.State == 0) {
    I = I.nextRecordset();
  }
  var INSERTED_ID = I(0).Value;
}
这将通过忽略先前关闭的结果集来查找包含范围标识的结果集

TRIGGER RESULT SET
SCOPE_IDENTITY RESULT SET
另见:


如果您可以阻止所有触发器返回结果集,则服务器选项“禁止从触发器返回结果”可能是您的解决方案

sp_configure 'disallow results from triggers', 1
GO
RECONFIGURE
GO

如果您可以阻止所有触发器返回结果集,那么服务器选项“禁止从触发器返回结果”可能是您的解决方案

sp_configure 'disallow results from triggers', 1
GO
RECONFIGURE
GO

“自动编号栏”,您是指标识栏?感谢您发现术语错误“自动编号栏”,您是指标识栏?感谢您发现术语错误