2011-08-09 6 views
6

와 저장 프로 시저를 다음과 같이 내가 저장 프로 시저가 있습니다SQL Server 2008은 다중 출력 매개 변수

ALTER PROCEDURE [dbo].[sp_web_orders_insert] 
(
    @userId int = default, 
    @custId int = default, 
    @orderDate datetime = default, 
    @orderTotal money = default, 
    @statusId int = default, 
    @orderReference varchar(50) = default, 
    @custReference varchar(50) = default, 
    @order_ID INT output, 
    @orderReferenceOutput varchar(50) output 
) 
AS 


    SET NOCOUNT OFF; 
    INSERT INTO [web_orders] ([user_ID], [cust_ID], [orderDate], [orderTotal], [statusId], [orderReference], [custReference]) VALUES (@userId, @custId, @orderDate, @orderTotal, @statusId , 'PLC' + REPLICATE('0', (7 - LEN((select MAX(order_ID) from web_orders)))) + CAST((select(max(order_ID)+1) from web_orders) AS VARCHAR(5)), @custReference); 

    SELECT @order_ID = @@IDENTITY 
    RETURN @order_ID 

    SELECT @orderReferenceOutput = 'PLC' + REPLICATE('0', (7 - LEN((select MAX(order_ID) from web_orders)))) + CAST((select(max(order_ID)+1) from web_orders) AS VARCHAR(5)) 
    RETURN @orderReferenceOutput 

을 어떤 이유로 두 번째 출력 매개 변수 @orderReferenceOutput 반환 아무것도. 이 두 번째 출력 매개 변수의 목적은 방금 데이터베이스에 삽입 한 열을 검색하는 것입니다.

+3

가장 쉬운 방법은 RETURN 명령을 주석 처리하는 것입니다. 이것은 그들이 원하는 것을위한 것이 아닙니다. –

답변

12

첫 번째 RETURN 후에 프로 시저 실행이 끝나며 "쿼리 나 프로 시저에서 무조건 종료됩니다."

RETURN @order_ID 

대신, 절차의 끝에서

SELECT @order_ID AS OrderID, @orderReferenceOutput AS OrderReference 

하나 개의 레코드로 두 값을 반환하는 것이 좋습니다.

+0

그게 대단히 고마워요. 대답을 받아 들일 때 – StevieB

+4

@Joe, 그는 이미 출력 매개 변수를 가지고 있습니다. 왜 레코드 셋의 오버 헤드를 추가하는 대신 사용하지 않을까요? –

2

저장 프로 시저에서 한 번만 반환 할 수 있습니다. soo nas가 첫 번째 리턴을 치면 proc을 종료합니다.

RETURN을 내기 전에 SET 조작을 사용하여 변수에 값을 할당하십시오. 여러 출력 매개 변수가

Microsoft Article on Return

13

, 당신은 그들을 사용해야합니다. RETURN 값은 오류/상태 코드 용이며 데이터 용이 아닙니다.

ALTER PROCEDURE [dbo].[sp_web_orders_insert] 
    @userId ..., 
    @order_ID INT OUTPUT, 
    @orderReferenceOutput VARCHAR(50) OUTPUT 
AS 
BEGIN 
    SET NOCOUNT OFF; -- WHY????????? 

    INSERT INTO [web_orders] (user_ID, ...) SELECT @userId, ...; 

    SELECT @order_ID = SCOPE_IDENTITY(); -- preferred over @@IDENTITY; 

    -- using @order_ID here instead of SELECT MAX() twice: 

    SELECT @orderReferenceOutput = 'PLC' 
     + REPLICATE('0', (7 - LEN((@order_ID+1)))) 
     + CAST((@order_ID+1) AS VARCHAR(5)) -- (5)? This breaks when you hit order #100,000 

    RETURN; -- do not RETURN any data - it's already in your OUTPUT parameters! 
END 
GO 
3

RETURN에서 원래 저장 프로 시저를 제거합니다.

은 @Id와 @Reference이 호출 프로세스에서 사용할 수있는

DECLARE @Id INT 
DECLARE @Reference VARCHAR(50) 

EXEC [dbo].[sp_web_orders_insert], @order_ID = @Id OUTPUT, 
    @orderReferenceOutput = @Reference OUTPUT 

처럼 보이게하기 위해 호출 명령을 조정합니다.

-1

exec 문장의 각 출력 끝 부분에 출력을 넣어야합니다. 그렇지 않으면 꺼내는 것이 모두 null입니다. 다음을 확인하는 간단한 테스트를 수행 할 수 있습니다.

if(@order_ID is null) 
Print '@order_ID is null' 
else 
Print '@order_ID is not null' 
+0

나는 이것이 OP 질문에 대답하지 않는다고 생각한다. – matsjoyce

관련 문제