2017-05-15 1 views
3

나는 많은 결정을 내렸음을 알고 있습니다. 아직 많은 경우에 절차가있는 경우 결과를 선택하고 절차를 종료합니다. 그것은 좋은 GOTO 문을 사용하기 위해, 또는 (고전하지 if...else)SqlServer GOTO를 사용하여 종료 절차 선택

예 더 나은 방법이 있습니다

create procedure MyProc @Parm int 
as 
    declare @Result nvarchar(50) 

    set @Result = 'OK' 

    if @Parm = 1 begin 
     set @Result = 'Error Example 1' 
     goto ExitProc; 
    end 

    if @Parm = 2 begin 
     set @Result = 'Error Example 2' 
     goto ExitProc; 
    end 

    if @Parm = 3 begin 
     set @Result = 'Error Example 3' 
     goto ExitProc; 
    end 

    ect... 

    ExitProc: 

    select @Result as Result, 100 as P2 
    from Table1 
+2

고토가 좋은 해결책이 결코 없다. 이것에 대해 많이 쓰여 있으며 수십 년 전에 금지되었습니다. 클래식 if..else가 최고의 솔루션입니다. 무엇이 잘못 되었습니까? – GuidoG

답변

3

성령 강림절 실제 코드 (같은 코멘트했다) 당신이 그들을 필요로 할 때마다, 당신은 종료 저장 프로 시저를 강제로 자신의 예외를 발생 수 ... 다른 경우 경우 단일 구조보다 더 복잡되고 응용 프로그램에 오류를 알리는 것입니다.

예 :

create procedure MyProc @Parm int 
as 
    if @Parm = 1 begin 
     THROW 60001, 'Error Example 1', 1; 
    end 

    if @Parm = 2 begin 
     THROW 60001, 'Error Example 2', 2; 
    end 

    if @Parm = 3 begin 
     THROW 60001, 'Error Example 3', 3; 
    end 

    ... 

이제 그들은 다른 SQL 오류 인 것처럼 SQL 서버에 의해 슬로우 이러한 예외를 잡을 수있는 응용 프로그램.

저장 프로 시저 자체에서 이러한 오류를 catch하고 처리 할 수도 있습니다. 응용 프로그램에서 오류를 catch하는 것이 더 우아하다고 생각할 수도 있습니다. 저장 프로 시저에서 오류를 잡는

예 :

create procedure MyProc @Parm int 
as 

    begin try 
     if @Parm = 1 begin 
     THROW 60001, 'Error Example 1', 1; 
     end 

     if @Parm = 2 begin 
     THROW 60001, 'Error Example 2', 2; 
     end 

     if @Parm = 3 begin 
     THROW 60001, 'Error Example 3', 3; 
     end 

     ... 
    end try 

    begin catch 
     select error_message() as Result, 100 as P2 
     from Table1 
    end catch 
+0

아주 좋은 생각. 고맙습니다. 그건 받아 들일 만하니? – inon

+1

catch 블록에서 "set @@ Result = error_message()"를 추가했습니다. "set @@ Result = '...'"대신 각 블록에서 – inon

+1

네가 발생할 수있는 다른 SQL 오류 (참조 오류, 0으로 나누기)를 잡기 때문에 훨씬 더 좋습니다.), error_message()에 대한 올바른 설명을 항상 갖게됩니다. 나는 대답을 수정할 것이다. –

0

대신 GOTOCASE를 사용할 수 있습니다.

CREATE PROCEDURE MyProc @Parm int AS 
    DECLARE @Result nvarchar(50) 

    SELECT 100 as P2, @Result = CASE @Parm 
         WHEN 1 THEN 'Error Example 1' 
         WHEN 2 THEN 'Error Example 2' 
         WHEN 2 THEN 'Error Example 3' 
         ELSE 'OK' 
        END