【发布时间】:2010-09-16 21:31:29
【问题描述】:
在 SQL Server 2005 中工作,我有一个存储过程,它插入一条记录并通过 SELECT @@IDENTITY 返回新 ID;作为最后一个命令。
然后我想从另一个存储过程中调用它,并获取新 ID 的值。
但我不知道如何获取第一个过程返回的值。
例子:
CREATE PROCEDURE spMyInsert(@Field1 VARCHAR(10)) AS
BEGIN
INSERT INTO tMyTable (Column1) VALUES (@Field1); // ID column implicitly set
SELECT @@IDENTITY ID;
END
CREATE PROCEDURE spMyMain AS
BEGIN
DECLARE @NewID INT;
EXEC spMyInsert 'TEST';
// How do I set @NewID to the value returned from spMyInsert?
END
还有另一个question 几乎回答了我的问题,但不完全是。这解释了如何将结果插入到另一个表中,但我要做的只是将它存储在一个局部变量中。
查看其他类似的问题,一般的答案是更改为设置 OUTPUT 变量或创建一个函数来执行此操作,但在我的情况下我不能这样做,因为其他 .NET 数据访问的东西使用相同的存储proc,我也不想将存储的 procs 的所有工作都复制为函数。
我尝试过但都失败的几件事是:
SET @NewID = (EXEC spMyInsert 'TEST');
SET @NewID = (SELECT ID FROM (EXEC spMyInsert 'TEST'));
有人知道怎么做吗?
谢谢, 本
【问题讨论】:
-
为什么不想使用
OUTPUT参数呢?对于返回标量值,这些是最佳选择。如果您只是想避免更改调用同一过程的现有代码,则可以为参数设置默认值。 -
从人们在这篇文章中留下的 cmets 中可以清楚地看出,对于我确实需要使用 OUTPUT 参数的其他问题。我会看看改变这一切所需的努力。我的问题是有一些我不想破坏的依赖关系!
-
+1 投票给所有建议 SCOPE_IDENTITY 而不是 @@IDENTITY 的人!!
标签: sql-server stored-procedures