2

ストアドプロシージャがデータを収集し、必要な結合を実行して結果を一時テーブルに挿入する次の状況があります(例:#Results)

ここで、#Resultsのすべてのレコードを以前に作成したテーブルに挿入しますが、最初に宛先を削除(切り捨て/削除)してから、結果を挿入します。キャッチは、宛先テーブルをクリーンアップしてから、トランザクションに新しい#Resultsを挿入するこのプロセスを配置することです。

私は次のことをしました:

BEGIN TRANSACTION

DELETE  FROM PracticeDB.dbo.TransTable

IF @@ERROR <> 0 
    ROLLBACK TRANSACTION
ELSE 
    BEGIN

        INSERT  INTO PracticeDB.dbo.TransTable
                ( 
                   [R_ID]
                  ,[LASTNAME]
                  ,[FIRSTNAME]
                  ,[DATASOURCE]
                  ,[USER_STATUS]
                  ,[Salary]
                  ,[Neet_Stat]
                )
                SELECT  [R_ID]
                      ,[LASTNAME]
                      ,[FIRSTNAME]
                      ,[DATASOURCE]
                      ,[USER_STATUS]
                      ,[Salary]
                      ,[Neet_Stat]
                FROM    #RESULT

        Select @@TRANCOUNT TransactionCount, @@ERROR ErrorCount
        IF @@ERROR <> 0 
            ROLLBACK TRANSACTION

        ELSE 
            COMMIT TRANSACTION

    END

しかし、それが適切に機能していないことはわかっており、このような例を見つけるのに苦労していますが、なぜそれが一般的なもののように見えるのかわかりません。この場合、挿入は失敗しますが、ターゲットテーブルは削除されます。

何よりも、この状況または同様のケースでのベストプラクティス(使用するのに最適なものなど)に最適なアプローチを行うためのガイダンスがあれば便利です。前もって感謝します...

4

1 に答える 1

1

私は本当にこれで何も悪いとは思っていません。TransTable からは削除しますが、挿入は行いませんか? #RESULT にレコードが含まれていますか?

私が見る唯一のことは、 @@ERROR が INSERT ステートメントではなく SELECT ステートメントからのものであることを意味@@ERRORSelect @@TRANCOUNT TransactionCount, @@ERROR ErrorCountます (ただし、常に 0 であると予想されます)。

@@ERROR の詳細については、http: //msdn.microsoft.com/en-us/library/ms188790.aspxを参照してください。

各ステートメントの後に @@ERROR を確認する必要があります。

ベスト プラクティスに関する限り、Microsoft は現在、各ステートメントの後に @@ERROR をチェックする代わりに TRY/CATCH を使用することを推奨していると思います (SQL 2005 以降)。ここで例 B を見てみましょう: http://msdn.microsoft.com/en-us/library/ms175976.aspx

于 2012-10-03T03:04:36.493 に答える