2011-12-23 11 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 без проблем с помощью ExecuteFunction из ObjectContext

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

Однако, когда я пытаюсь вызвать его непосредственно из SQL скрипта он, похоже, не работает

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

@Id всегда 0. Как мне получить значение в переменной @Id в sql-скрипте?

ответ

6

Возвращаемое значение процедуры отличается от набора результатов, возвращаемых этой процедурой. Ваша хранимая процедура возвращает результирующий набор и не возвращает возвращаемое значение (которое заканчивается null, которое неявно переходит в 0 после выхода из процедуры).
Чтобы получить Resultset существующие процедуры 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

Смежные вопросы