3

データベースからテーブルが削除された場合のエラーを処理したい状況は次のようになります-

ALTER procedure ABC as 
begin tran tansinsert
insert into table1 values (1,2,3)
if @@error <> 0
begin
rollback tran tansinsert
end
else
begin
commit tran tansinsert
end

このプロシージャを実行していて、テーブル'table1'がデータベースになかった場合、エラーメッセージが表示されます。

4

3 に答える 3

3

一方通行

IF NOT  EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[table1 ]') AND type in (N'U'))
BEGIN
       RAISERROR(......)
END
ELSE
BEGIN
--rest of flow
END
GO
于 2012-05-22T13:28:25.943 に答える
1

エラーをキャッチするためのサンプルコード

BEGIN TRY
     EXECUTE Abc
END TRY

BEGIN CATCH
     print 'Error got'
     SELECT 
          ERROR_NUMBER() as ErrorNumber,
          ERROR_MESSAGE() as ErrorMessage;
END CATCH;

次のことを行うと、これは機能しません。

CREATE PROC test
AS
BEGIN TRY
  SELECT * FROM NonexistentTable
END TRY

BEGIN CATCH
   -- some code
END CATCH

これが機能する唯一の方法は、1つのストアドプロシージャが次のような別のストアドプロシージャを呼び出す場合です。

CREATE PROC Test
AS
SELECT * FROM NonexistentTable
GO

CREATE PROC test2
AS
BEGIN TRY
  EXECUTE Test
END TRY

BEGIN CATCH
   -- some code
END CATCH
GO

TRY…CATCHコンストラクトは、次の条件をトラップしません。

  1. 重大度が10以下の警告または情報メッセージ。

  2. セッションのSQLServerデータベースエンジンタスク処理を停止する重大度が20以上のエラー。重大度が20以上のエラーが発生し、データベース接続が中断されていない場合、TRY…CATCHがエラーを処理します。

  3. クライアントの中断要求やクライアント接続の切断などの注意。

  4. システム管理者がKILLステートメントを使用してセッションを終了したとき。

次のタイプのエラーは、TRY…CATCHコンストラクトと同じ実行レベルで発生した場合、CATCHブロックによって処理されません。

  1. バッチの実行を妨げる構文エラーなどのコンパイルエラー。
  2. 名前解決が延期されたためにコンパイル後に発生するオブジェクト名解決エラーなど、ステートメントレベルの再コンパイル中に発生するエラー。
于 2012-05-22T13:28:30.683 に答える
1

あなたはこれを試すことができます...

IF OBJECT_ID('DBNAME..TABLENAME') IS NOT NULL
BEGIN
//YOUR CODE FLOW HERE
END

ELSE
BEGIN
//RAISE ERROR HERE
END
GO
于 2012-05-22T13:37:27.087 に答える