web-dev-qa-db-ja.com

SQLサーバーでトランザクションをコミットおよびロールバックする方法は?

1つのサーバーからテーブルを作成してデータを移植するための巨大なスクリプトがあります。したがって、この領収書は基本的に-

  1. テーブルのステートメントを作成します。
  2. これらの新しく作成されたテーブルにデータを移植するために挿入します。
  3. ストアドプロシージャのステートメントを作成します。

だから私はこのコードを持っていますが、基本的には動作しません@@ ERRORは常にゼロだと思います..

BEGIN TRANSACTION
--CREATES
--INSERTS
--STORED PROCEDURES CREATES
    -- ON ERROR ROLLBACK ELSE COMMIT THE TRANSACTION
    IF @@ERROR != 0
        BEGIN

            PRINT @@ERROR
                      PRINT 'ERROR IN SCRIPT'
            ROLLBACK TRANSACTION
            RETURN
        END
    ELSE
    BEGIN
        COMMIT TRANSACTION
        PRINT 'COMMITTED SUCCESSFULLY'
    END
    GO

誰でも私が基本的にエラーでロールバックし、すべてがうまくいけばコミットするトランザクションを書くのを手伝ってもらえますか?ここで何とか RaiseError を使用できます。

15
Vishal

@@ERRORを使用せず、代わりにBEGIN TRY/BEGIN CATCHを使用してください。次の記事を参照してください: 例外処理とネストされたトランザクション サンプルプロシージャについて:

create procedure [usp_my_procedure_name]
as
begin
    set nocount on;
    declare @trancount int;
    set @trancount = @@trancount;
    begin try
        if @trancount = 0
            begin transaction
        else
            save transaction usp_my_procedure_name;

        -- Do the actual work here

lbexit:
        if @trancount = 0   
            commit;
    end try
    begin catch
        declare @error int, @message varchar(4000), @xstate int;
        select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
        if @xstate = -1
            rollback;
        if @xstate = 1 and @trancount = 0
            rollback
        if @xstate = 1 and @trancount > 0
            rollback transaction usp_my_procedure_name;

        raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
        return;
    end catch   
end
26
Remus Rusanu

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

@@ ERROR:最後に実行されたTransact-SQLステートメントのエラー番号を返します。

ロールバックとリターンを実行するには、各ステートメントの後に確認する必要があります。

コミットは最後に行うことができます。

HTH

2
Eben Roux

「@@ ERROR」への直接参照は避けてください。それは失われる可能性があります飛行の小さなものです。

Declare @ErrorCode int;
... perform stuff ...
Set @ErrorCode = @@ERROR;
... other stuff ...
if @ErrorCode ...... 
0
davidWazy