web-dev-qa-db-ja.com

THROW SQL Server 2008 R2を使用できません

SQL Server 2008 R2 Management Studioは、以下の例で私のスローを認識しません、と述べています

throwの近くの不正な構文

ここでエラーをスローしようとしているので、誰かが同じ値を2回挿入したときに自分のWebサイトで処理できます。

Begin Try
 insert into BusinessID (BusinessID) values (@ID)
 insert into BusinessID (BusinessID) values (@ID)

End Try

Begin Catch

Print 'PK already exist'
THROW
End Catch
21
user2405574

THROWステートメントはSQL Server 2012で導入されました

http://msdn.Microsoft.com/en-us/library/ee677615.aspx

代わりにRAISERRORを使用できます。

http://msdn.Microsoft.com/en-us/library/483588bd-021b-4eae-b4ee-216268003e79(v = sql.105)

BEGIN CATCH
    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    RAISERROR (@ErrorMessage, -- Message text.
               @ErrorSeverity, -- Severity.
               @ErrorState -- State.
               );
END CATCH;
42
Nenad Zivkovic

SQLブロックでThrowの代わりに [〜#〜] raiserror [〜#〜] を使用します。

Begin Try
 insert into BusinessID (BusinessID) values (@ID)
 insert into BusinessID (BusinessID) values (@ID)

End Try

Begin Catch

Print 'PK already exist'
  DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

SELECT 
    @ErrorMessage = ERROR_MESSAGE(),
    @ErrorSeverity = ERROR_SEVERITY(),
    @ErrorState = ERROR_STATE();

-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
           @ErrorSeverity, -- Severity.
           @ErrorState -- State.
           );
End Catch
4
Pawan