SCOPE_IDENTITY - 调用另一个插入过程的过程

时间:2011-07-18 10:48:43

标签: sql-server tsql sql-server-2008

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

我的问题是,我是否可以使用SCOPE_IDENTITY中的sp1IDENTITY在表格中插入sp2

4 个答案:

答案 0 :(得分:4)

SCOPE_IDENTITY()提供范围内的最新ID,因此只要sql命中“GO”,就会创建一个新范围并且您不会收到该标识,您可以添加输出sp2上的参数,用于接收可能是最佳方式的标识。

答案 1 :(得分:3)

正如Joakim所说,SCOPE_IDENTITY()不会从第二个程序返回身份。来自SCOPE_IDENTITY()

上的MSDN文档
  

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

@@Identity确实按照您想要的方式行事,但其主要缺点是它在当前连接包括触发器中获取最新身份。即使你100%确定没有触发器作用于相关表,任何后来添加触发器的人都会破坏这一点,引入一个棘手的查找bug,所以考虑到使用输出参数是多么简单,我真的建议不要@@Identity

答案 2 :(得分:1)

您创建一个输出参数,以在执行插入的proc中保存所需的标识值。并使用scope_identitiy或输出子句的结果对其进行podpulate。

然后在调用proc中创建一个同名变量,并以这种方式调用proc:

exec @id = usp_my_proc @someinputvariable, @someotherinputvariable

答案 3 :(得分:0)

你应该尽可能地努力封装。不仅可以 SP2返回新的范围标识值; SP2 应该返回新的范围标识值。它可以作为RETURN值或OUT参数返回。

始终最好避免使用全局变量。