我有一个存储过程(假设为sp1
),它执行一些代码来检查传递的参数是否违反了业务规则。验证后,它调用另一个存储过程(比如sp2
),它实际上将记录插入表中。
我的问题是,我是否可以使用SCOPE_IDENTITY
中的sp1
来IDENTITY
在表格中插入sp2
?
答案 0 :(得分:4)
SCOPE_IDENTITY()
提供范围内的最新ID,因此只要sql命中“GO
”,就会创建一个新范围并且您不会收到该标识,您可以添加输出sp2上的参数,用于接收可能是最佳方式的标识。
答案 1 :(得分:3)
正如Joakim所说,SCOPE_IDENTITY()
不会从第二个程序返回身份。来自SCOPE_IDENTITY()
范围是一个模块:存储过程,触发器,函数或批处理。 因此,如果两个语句在同一范围内,则它们在同一范围内 相同的存储过程,功能或批处理。
@@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参数返回。
始终最好避免使用全局变量。