exec 결과를 SQL 변수에 할당하는 방법은 무엇입니까?


108

exec 호출의 결과를 SQL의 변수에 어떻게 할당합니까? up_GetBusinessDay단일 날짜를 반환 하는 저장된 proc이 있습니다.

다음과 같이 할 수 있습니까?

exec @PreviousBusinessDay = dbo.up_GetBusinessDay @Date, -1

답변:


97

항상 반환 값을 사용하여 오류 상태를 다시 전달합니다. 하나의 값을 다시 전달해야하는 경우 출력 매개 변수를 사용합니다.

OUTPUT 매개 변수가있는 샘플 저장 프로 시저 :

CREATE PROCEDURE YourStoredProcedure 
(
    @Param1    int
   ,@Param2    varchar(5)
   ,@Param3    datetime OUTPUT
)
AS
IF ISNULL(@Param1,0)>5
BEGIN
    SET @Param3=GETDATE()
END
ELSE
BEGIN
    SET @Param3='1/1/2010'
END
RETURN 0
GO

OUTPUT 매개 변수를 사용하여 저장 프로 시저를 호출합니다.

DECLARE @OutputParameter  datetime
       ,@ReturnValue      int

EXEC @ReturnValue=YourStoredProcedure 1,null, @OutputParameter OUTPUT
PRINT @ReturnValue
PRINT CONVERT(char(23),@OutputParameter ,121)

산출:

0
2010-01-01 00:00:00.000

10
OUTPUT 매개 변수를 사용하면 모든 데이터 형식을 반환 할 수 있으며 저장 프로 시저의 RETURN 값은 정수만 될 수 있습니다.
KM.

2
참고로, 값으로 선언 된 OUTPUT 매개 변수는 전달할 필요가 없습니다. 이는 기존 SP를 변경하는 경우 아무것도 손상시키지 않고 안전하게 수행 할 수 있음을 의미합니다. 예 : @ Param3 datetime = '1900-01-01'OUTPUT.
Morvael 2016

55

단순히 정수를 반환하려는 경우 작동합니다.

DECLARE @ResultForPos INT 
EXEC @ResultForPos = storedprocedureName 'InputParameter'
SELECT @ResultForPos

13
-1 정수만 반환합니다. OP는 날짜를 반환하려고합니다. @KM이 수락 한 답변입니다. RETURN 대신 OUTPUT을 사용하므로 정답입니다.
Code Maverick

4
실제로 이것은 작동합니다. 반환되는 정수를 얻는 방법에 대한 예는 다른 모든 종류에 대해서도 동일하게 할 수 있습니다 (테이블이 가능한지 확인하지 않았지만 예라고 생각합니다.) 방금 nvarchar (50)에 대해 시도했습니다.
Mzn 2014 년

2
@Mzn "다른 모든 종류에 대해 똑같이 할 수 있습니다" , 확실히 UNIQUEIDENTIFIER.
James

1
@James 왜? uniqueidentifier 데이터 유형의 차이점은 무엇입니까? 저장 프로 시저가 고유 식별자를 반환 할 수 없습니까?
Mzn

3
@Mzn UNIQUEIDENTIFIER은 예시 일 RETURN뿐이며 정수 값으로 만 작동하도록 설계되었습니다 . 문서를 참조하세요 . SP에서 다른 데이터를 가져 오는 권장 방법은 결과 집합을 반환하거나 사용하는 것입니다OUTPUT
James

34
declare @EventId int

CREATE TABLE #EventId (EventId int)

insert into #EventId exec rptInputEventId

set @EventId = (select * from #EventId)

drop table #EventId 

3
실제로 유일한 작업 방법은 저장된 프로 시저의 서명을 변경 떨어져 여기에 설명한 기능
마이클 샌더에게

2
기본 Sproc에 출력 매개 변수가없는 날짜에도 이것을 사용했습니다. (근본적인 SPROC는 동적 SQL에서 그 안에 또 다른 Exec이 있었다)
제프 Beagley

3
@MichaelSander 완전히 맞습니다. 다른 모든 솔루션은 OP 질문에 올바르게 대답 하지 않습니다 . 유일한 방법은 결과를 보관하는 임시 테이블입니다.
SQL 경찰

3
proc에 대한 편집없이 여기서 작동하는 유일한 방법인데, 제 경우에는 할 수 없습니다. +1
DLeh 2017

임시 테이블 대신 테이블 변수를 사용할 수도 있습니다.
오류

6

로부터 문서 (당신은 SQL-Server를 사용한다고 가정) :

USE AdventureWorks;
GO
DECLARE @returnstatus nvarchar(15);
SET @returnstatus = NULL;
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;
PRINT @returnstatus;
GO

네, 그렇게되어야합니다.


8
OP의 예에서 날짜를 반환하려는 경우 저장 프로시 저는 호출 프로 시저 또는 응용 프로그램에 정수 값만 반환 할 수 있습니다.
KM.

0

저도 같은 질문을했습니다. 여기에 좋은 대답이 있지만 테이블 반환 함수를 만들기로 결정했습니다. 테이블 (또는 스칼라) 값 함수를 사용하면 저장된 프로 시저를 변경할 필요가 없습니다. 저는 단순히 테이블 반환 함수에서 선택했습니다. 매개 변수 (MyParameter는 선택 사항 임)에 유의하십시오.

CREATE FUNCTION [dbo].[MyDateFunction] 
(@MyParameter varchar(max))
RETURNS TABLE 
AS
RETURN 
(
    --- Query your table or view or whatever and select the results.
    SELECT DateValue FROM MyTable WHERE ID = @MyParameter;
)

변수에 할당하려면 다음과 같이하면됩니다.

Declare @MyDate datetime;
SET @MyDate = (SELECT DateValue FROM MyDateFunction(@MyParameter));

스칼라 값 함수를 사용할 수도 있습니다.

CREATE FUNCTION TestDateFunction()  
RETURNS datetime  
BEGIN  
    RETURN (SELECT GetDate());
END

그런 다음 간단히 할 수 있습니다.

Declare @MyDate datetime;
SET @MyDate = (Select dbo.TestDateFunction());
SELECT @MyDate;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.