T-SQL尝试...捕获和多个批次(2个开始...结束,如果......其他)

时间:2012-03-07 10:45:55

标签: sql sql-server tsql if-statement try-catch

我正在尝试了解尝试...抓取构建如何在T-SQL中运行。

所以我在MSDN上阅读了文章:http://msdn.microsoft.com/en-us/library/ms175976.aspx

我对这句话有点困惑: TRY ... CATCH构造不能跨越多个批次。 TRY ... CATCH构造不能跨越多个Transact-SQL语句块。例如,TRY ... CATCH构造不能跨越Transact-SQL语句的两个BEGIN ... END块,并且不能跨越IF ... ELSE构造。

它说try ... catch不能跨越2个BEGIN ... END块,不能跨越IF ... ELSE构造。

然而,我已经尝试过它并且有效! (2005年和2008年)

有人可以解释原因吗?在MSDN上看起来有些错误。

查看我的测试脚本:

print 'start'
begin transaction test_tran
begin try
    -- first begin ... end
    begin
        -- some statements
        print 'begin ... end - #1'
    end
    -- second begin ... end
    begin
        print 'begin ... end - #2'
        -- statement with error
        select 1/0 -- division by zero
    end
    print 'end of try'
end try
begin catch
    print 'catch'
    goto RollbackTran
end catch

-- commit
print 'commit'
commit transaction test_tran

-- rollback
RollbackTran:
    BEGIN
        print 'rollback'
        WHILE @@TRANCOUNT > 0 
        begin
            ROLLBACK TRANSACTION test_tran
            print 'actual rollback'
        end
    END

结果:

start
begin ... end - #1
begin ... end - #2

(0 row(s) affected)
catch
rollback
actual rollback

它有效(2个开始...结束块)!但是MSDN说它不应该。 IF ... ELSE声明同样如此。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:6)

T-SQL批处理通常用GO语句表示。他们说你不能这样做:

BEGIN TRY

    PRINT 'statement 1'

    GO -- Cannot have a GO to end batch inside of a TRY / CATCH

    PRINT 'statement 2'

END TRY
BEGIN CATCH

    PRINT 'Catch Block'

END CATCH

同样你不能:

IF (1 = 1)
BEGIN
   BEGIN TRY

     PRINT 'test'

END -- Cannot END a block that began prior to the TRY / CATCH

   END TRY
   BEGIN CATCH

     PRINT 'Catch block'

   END CATCH

你也不能这样做:

IF (1 = 1)
    BEGIN TRY

        PRINT 'statement 1'

ELSE -- Cannot do ELSE for an IF that started prior to the TRY / CATCH
        PRINT 'statement 2'

    END TRY
    BEGIN CATCH

        PRINT 'Catch Block'

    END CATCH