提高SQL Server中的过程的性能

时间:2016-09-25 07:38:46

标签: sql-server performance stored-procedures try-catch

我正在编写一个存储过程,它将用于每4分钟进行一次同步。它只是一个测试用例,我也需要在其中捕获异常。在这个过程中是否还有其他方法可以使用try和catch块?或者这很好吗?

这是存储过程:

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

1 个答案:

答案 0 :(得分:0)

单个更新或Insert语句将自动处于原子事务中。您不需要显式事务来启动和提交。如果该语句成功,那么它将被提交,否则它已经被回滚。此外,您没有在catch中显式回滚,这是不必要的。

另外,block不需要另一个条件'IF @@ Rowcount> 0'原因是如果它在else块下面,则意味着你有该值的记录。