2013-08-01 3 views
0

나는 (내가 수정할 수 아니에요) 다음 (간체) 저장 프로 시저가 있습니다캡처 스칼라 출력

CREATE PROCEDURE [dbo].[spDoSomething] 
    @someArg INT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @SomeID INT 

    -- some code which sets @SomeID -- 
    SET @SomeID = 10 

    SELECT @SomeID AS SomeID 
END 

NHibernate에에서 실행, 나는 프로파일에 다음 쿼리를 참조하십시오

exec sp_executesql N'exec spDoSomething @p0', 
N'@p0 INT', 
@p0=1 

NHibernate에 어떻게 든 SELECT 에드 @SomeID의 값을 검색 할 수 있습니다.

이 스크립트를 MSSQL ManagementStudio에서 실행하면 선택한 결과가 표시됩니다.

간단한 SQL 쿼리로 sp_executesql에 사용하는 것과 동일한 OUTPUT 방식을 사용하려고했습니다. 예를 들어,

exec sp_executesql N'INSERT INTO Users ... VALUES (...); select @UserId = SCOPE_IDENTITY()', 
N'@UserId INT OUTPUT, ...', 
@UserId OUTPUT, ... 

과 같이 실행하면 SCOPE_IDENTITY()의 결과가 @UserId에 저장됩니다. 그러나 어떤 이유로 동일한 접근 방식이 내 [spDoSomething]에서 작동하지 않습니다. 다음을 시도해 보면 :

DECLARE @ReturnedID INT 

exec sp_executesql N'exec spDoSomething @p0', 
N'@ReturnedID INT OUTPUT, @p0 INT', 
@ReturnedID OUTPUT, @p0=1 

SELECT @ReturnedID 

다음으로 @ReturnedID는 NULL입니다.

@SomeID 값을 @ReturnedID에 어떻게 포착합니까? 당신이 SP를 변경할 수 없기 때문에

답변

1

, 당신은 insert...exec

declare @returnedID int 

declare @t table (result int) 
insert @t (result) exec spDoSomething 
select @returnedID = result from @t 

select @returnedID 

를 사용하거나 수 있습니다 당신은 어떤 이유로

declare @returnedID int 

exec sp_ExecuteSQl 
    N'declare @t table (result int);insert @t (result) exec spDoSomething; select @returnedID = result from @t', 
    N'@returnedID int output', 
    @returnedID output 

select @returnedID 
에 대한 sp_executesql을을 사용해야하는 경우