Sql server SCOPE_IDENTITY-调用另一个过程以进行插入的过程

Sql server SCOPE_IDENTITY-调用另一个过程以进行插入的过程,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,我有一个存储过程(比如说sp1),它执行一些代码来检查传递的参数是否违反业务规则。在验证之后,它调用另一个存储过程(比如说sp2),该存储过程实际上将记录插入表中 我的问题是,我是否可以使用sp1中的SCOPE\u IDENTITY获得sp2插入到表中的标识?SCOPE\u IDENTITY()提供范围中的最新id,因此只要sql点击一个“GO”就会创建一个新的范围,您就不会收到该标识,您可以在sp2上添加一个输出参数来接收标识,这可能是最好的方式。SCOPE\u identity()提供了一个

我有一个存储过程(比如说
sp1
),它执行一些代码来检查传递的参数是否违反业务规则。在验证之后,它调用另一个存储过程(比如说
sp2
),该存储过程实际上将记录插入表中


我的问题是,我是否可以使用
sp1
中的
SCOPE\u IDENTITY
获得
sp2
插入到表中的
标识?

SCOPE\u IDENTITY()
提供范围中的最新id,因此只要sql点击一个“
GO
”就会创建一个新的范围,您就不会收到该标识,您可以在sp2上添加一个输出参数来接收标识,这可能是最好的方式。

SCOPE\u identity()
提供了一个作用域的最新id,因此只要sql点击“
GO
”就会创建一个新的作用域,您就不会收到标识,您可以在sp2上添加一个输出参数来接收标识,这可能是最好的方法。

正如Joakim所说,
SCOPE\u identity()
不会从第二个过程返回标识。从上的MSDN文档

作用域是一个模块:存储过程、触发器、函数或批处理。 因此,如果两个语句在同一范围内,则它们在同一范围内 相同的存储过程、函数或批处理


@@Identity
的行为符合您的要求,但其主要缺点是它会在当前连接中拾取最新的标识,包括触发器。即使您百分之百确定相关表上没有触发器,以后添加触发器的任何人都会破坏这一点,引入一个很难找到的bug,因此考虑到使用输出参数是多么简单,我建议不要使用
@@Identity

,正如Joakim所说,
SCOPE\u Identity()
不会从第二个过程返回标识。从上的MSDN文档

作用域是一个模块:存储过程、触发器、函数或批处理。 因此,如果两个语句在同一范围内,则它们在同一范围内 相同的存储过程、函数或批处理


@@Identity
的行为符合您的要求,但其主要缺点是它会在当前连接中拾取最新的标识,包括触发器。即使您百分之百确定相关表上没有触发器,以后添加触发器的任何人都会打破这一点,引入一个难以发现的错误。因此,考虑到使用输出参数是多么简单,我建议不要使用
@@Identity

,只要可能,您应该始终努力进行封装。SP2不仅可以返回新的作用域标识值;SP2应该返回新的作用域标识值。它可以作为返回值或输出参数返回


始终最好避免全局性。

您应该始终尽可能地进行封装。SP2不仅可以返回新的作用域标识值;SP2应该返回新的作用域标识值。它可以作为返回值或输出参数返回


始终最好避免全局变量。

您可以创建一个输出参数,以在执行插入的过程中保存所需的标识值。并用范围标识或输出子句的结果填充它

然后在调用过程中创建一个同名变量,并按以下方式调用该过程:

exec @id = usp_my_proc @someinputvariable, @someotherinputvariable

您可以创建一个输出参数来保存执行插入的过程中所需的标识值。并用范围标识或输出子句的结果填充它

然后在调用过程中创建一个同名变量,并按以下方式调用该过程:

exec @id = usp_my_proc @someinputvariable, @someotherinputvariable

即使现在没有触发器,如果您使用@@Identity,以后添加一个触发器也会破坏这一点。@HLGEM我写过“永远不会有”,但我将进行编辑以使这一点更清楚。即使现在没有触发器,如果您使用@@Identity,以后添加一个触发器也会破坏这一点。@HLGEM我写过“永远不会有”但我会编辑以使这一点更清楚。