SQL Server:如何在查询分析器中中止一系列批处理?

Ian*_*oyd 4 sql-server sql-server-2005 sql-server-2000 query-analyzer

我有一系列由特殊的查询分析器批处理分隔符关键字分隔的T-SQL语句:

GO
Run Code Online (Sandbox Code Playgroud)

如果一个批次失败,我需要查询分析器不尝试后续批次 - 我希望它停止处理一系列批次.

例如:

PRINT 'This runs'
go

SELECT 0/0, 'This causes an error'
go

PRINT 'This should not run'
go
Run Code Online (Sandbox Code Playgroud)

输出:

This runs
Server: Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
This should not run
Run Code Online (Sandbox Code Playgroud)

可能?


更新

实际使用中的一个例子可能是:

 sp_rename 'Shelby', 'Kirsten'
 go

 DROP VIEW PeekAView
 go

 CREATE VIEW PeekAViewAS 
 SELECT * FROM Kirsten
 go
Run Code Online (Sandbox Code Playgroud)

Tim*_*nke 8

我是这样做的:

PRINT 'This runs'
go

SELECT 0/0, 'This causes an error'
go
if (@@error <> 0)
    Begin
    set nocount on
    set noexec on
    End
GO

PRINT 'This should not run'
go

set noexec off
set nocount off
GO
Run Code Online (Sandbox Code Playgroud)

"noexec"模式使SSMS处于一种只编译T-SQL并且实际上不执行它的状态.它类似于意外按下Parse工具栏按钮(Ctrl + F5)而不是Execute(F5).

不要忘记在脚本结束时关闭noexec.否则,用户会因永久"命令已成功完成"而感到困惑.消息.

我在后续批处理中使用对@@ error的检查,而不是使用TRY CATCH块.在下一批中使用@@ error将捕获编译错误,例如"表不存在".

除了noexec模式,我还切换了nocount模式.启用noexec模式并关闭nocount后,您的查询仍将报告消息"(0行(s)受影响)".该消息始终报告零行,因为您处于noexec模式.然而,转向nocount会抑制这些消息.

另请注意,如果正在运行SQL Server 2005,则跳过的命令如果引用了不存在的表,则可能仍会显示错误消息,如果批处理中的第一个命令,则该命令仍然是命令.使用伪造的Print语句强制命令成为批处理中的第二个命令可以抑制此操作.有关详细信息,请参阅MS Bug#569263.