sql-server - SQL Server : How to abort a series of batches in Query Analyzer?

标签 sql-server sql-server-2005 sql-server-2000 query-analyzer

我有一系列由特殊查询分析器批处理分隔符关键字分隔的 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/

相关文章:

c# - 在 C# 中使用存储过程输出参数

c# - 无法打开登录请求的数据库 "dbname"。登录失败。用户 "machinname\username"登录失败

sql - SQL 更新中的字段顺序重要吗?

sql - 仅在字符/分隔符第一次出现时分割字符串

sql - 使用存储过程访问数据

sql - OPENXML,将 Base64 转换为二进制

sql-server-2005 - 在 SQL Server 2005 中的 View 上创建全文索引

日期范围越小SQL查询时间越长?

SQL Server - 在带有文本和数字的 varchar 字段中的两个数字范围之间进行选择

sql - 在 SQL Server 2000 中连接结果集中的列