Sql server 为什么不是';t SCOPE_IDENTITY()是否返回插入的ID?
我有一个insert语句,通过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
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
“自动编号栏”,您是指标识栏?感谢您发现术语错误“自动编号栏”,您是指标识栏?感谢您发现术语错误