2011-12-23 107 views
1

這似乎是一個簡單的問題,但我還沒有找到答案。從SQL Server存儲過程獲取值輸出到變量

我有以下存儲過程

CREATE PROCEDURE [dbo].[AllocateId] 
AS 
    BEGIN TRANSACTION 

    UPDATE TOP(1) IdReservation 
    SET IsAllocated = 1 
    OUTPUT DELETED.Id 
    WHERE IsAllocated = 0 

    COMMIT TRANSACTION 
    GO 

它在C#+ EF代碼通過ObjectContext的

ObjectResult<int> objectResult = ExecuteFunction<int>("AllocateId"); 

然而ExecuteFunction被使用沒有問題,當我嘗試直接從SQL腳本中調用它它似乎沒有工作

declare @Id int 
EXEC @Id = [dbo].[AllocateId] 

@Id始終爲0.如何在sql腳本中將值變爲@Id變量?

回答

6

過程返回值與該過程返回的結果集不同。您的存儲過程返回一個結果集並且不返回返回值(最終結果爲null,在退出過程時隱式轉換爲0)。
要得到結果集中現有的程序retuns,你需要insert ... exec

declare @t table (id int); 

insert into @t 
exec [dbo].[AllocateId]; 

如果你想返回一個值作爲返回值,以及,你應該修改你的存儲過程:

CREATE PROCEDURE [dbo].[AllocateId] 
AS 
BEGIN TRANSACTION 

declare @id int; 

UPDATE TOP(1) IdReservation 
    SET @id = Id, IsAllocated = 1 
    OUTPUT DELETED.Id 
    WHERE IsAllocated = 0 

COMMIT TRANSACTION 

return @id; 

然後它會以你在問題中描述的方式工作。

+0

我注意到我評論後。這並不清楚,除了你的評論,這使得它更清晰:) – MatBailie 2011-12-23 17:55:35

相關問題