我有一系列由特殊查询分析器批处理分隔符关键字分隔的 T-SQL 语句:
GO
如果一个批处理失败,我需要查询分析器不要尝试后续批处理 - 我希望它停止处理这一系列批处理。
例如:
PRINT 'This runs'
go
SELECT 0/0, 'This causes an error'
go
PRINT 'This should not run'
go
输出:
This runs
Server: Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
This should not run
可能吗?
<小时/>更新
实际使用中的一个示例可能是:
sp_rename 'Shelby', 'Kirsten'
go
DROP VIEW PeekAView
go
CREATE VIEW PeekAViewAS
SELECT * FROM Kirsten
go
最佳答案
这是我的做法:
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
“noexec”模式使 SSMS 处于一种仅编译 T-SQL 而并不实际执行它的状态。这类似于意外按下“解析”工具栏按钮 (Ctrl+F5) 而不是“执行”(F5)。
不要忘记在脚本末尾关闭 noexec。否则,用户将会对永久的“命令成功完成”感到困惑。消息。
我在后续批处理中使用对 @@error 的检查,而不是使用 TRY CATCH block 。在下一批中使用 @@error 将捕获编译错误,例如“表不存在”。
除了 noexec 模式外,我还切换 nocount 模式。在开启 noexec 模式且关闭 nocount 的情况下,您的查询仍将报告消息“(0 rows(s)受影响)”。该消息始终报告零行,因为您处于 noexec 模式。但是,打开 nocount 会抑制这些消息。
另请注意,如果运行 SQL Server 2005,如果您跳过的命令引用了不存在的表,并且该命令是批处理中的第一个命令,则该命令可能仍会给出错误消息。使用伪造的 Print 语句强制该命令成为批处理中的第二个命令可以抑制这种情况。请参阅MS Bug #569263了解更多详情。
关于sql-server - SQL Server : How to abort a series of batches in Query Analyzer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/927102/