2016-09-25 4 views
0

4分ごとに同期のために使用されるストアドプロシージャを作成しています。これは単なるテストケースであり、例外も同様に取り込む必要があります。この手順でtryとcatchブロックを使用する他の方法はありますか?これは問題ありませんか?ここでSQL Serverのプロシージャのパフォーマンスを向上させる

は、ストアドプロシージャです:

Create procedure inbound_test 
    @APP1_NO int, 
    @APP1_NAME nvarchar (20), 
    @APP1_CREATED date, 
    @APP1_NO_PK nvarchar(20) 
as 
    if exists (select App1_no from test_in1 where App1_no = @APP1_NO) 
    Begin try 
    Begin transaction 
     Update test_in1 
     set APP1_NO = @APP1_NO, 
      APP1_NAME = @APP1_NAME, 
      APP1_CREATED = @APP1_CREATED, 
      APP1_NO_PK = @APP1_NO_PK 
     where App1_no = @APP1_NO 

    Commit transaction 
    End try 
    Begin Catch 
     If @@Trancount > 0 
      Throw; 
    End Catch 

else 

If @@ROWCOUNT=0 
Begin try 
Begin Transaction 

insert into test_in1(
APP1_NO , 
APP1_NAME , 
APP1_CREATED, 
APP1_NO_PK 
) 
values (@APP1_NO ,@APP1_NAME , @APP1_CREATED,@APP1_NO_PK) 
Commit transaction 
End try 

Begin Catch 
If @@Trancount >0 
Throw; 
End Catch 
GO 

答えて

0

シングル更新または挿入ステートメントがアトミック・トランザクションに自動的になります。明示的なトランザクションを開始してコミットする必要はありません。その文が成功した場合は、コミットされます。それ以外の場合は、すでにロールバックされています。また、キャッチに明示的なロールバックは必要ありません。

また、ブロックに別の条件 'IF @@ Rowcount> 0'が必要でない理由は、elseブロックの下にある場合は、その値のレコードがあることを意味します。

+0

ご回答ありがとうございます。 elseステートメントを使用していない場合、Insertステートメントが機能していません。このプロシージャーからトランザクションを削除します。この手順はWebサービスで使用され、4分ごとに同期に使用されるため、パフォーマンスを向上させるために何ができるのか教えてください。 – paemmi

+0

このように、2つの簡単なステートメントは更新または挿入です適切なインデックスを追加し、実行計画とレコードのボリュームを確認して、そのレコードを決定することができます。 –

関連する問題