vk_*_*use 4 sql t-sql sql-server 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
Run Code Online (Sandbox Code Playgroud)
结果:
start
begin ... end - #1
begin ... end - #2
(0 row(s) affected)
catch
rollback
actual rollback
Run Code Online (Sandbox Code Playgroud)
它工作(2开始......结束块)!但是MSDN说它不应该.IF ... ELSE声明也是如此.
有人可以解释一下吗?
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
Run Code Online (Sandbox Code Playgroud)
同样你不能:
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
Run Code Online (Sandbox Code Playgroud)
你也不能这样做:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9315 次 |
最近记录: |