功能强大的全新 T-SQL 语法极大地提升了 SQL Server 的可编程性

时间:2007-02-12 00:00:00  来源:  作者:
错误处理 错误处理 SNAPSHOT 隔离 SNAPSHOT 隔离 WAITFOR 命令 WAITFOR 命令 BULK 行集提供程序 BULK 行集提供程序 TOP 选项 TOP 选项 APPLY 运算符 APPLY 运算符 通用表表达式和递归查询 通用表表达式和递归查询 PIVOT 运算符 PIVOT 运算符 触发器和通知 触发器和通知 小结 小结

SQL Server 下一版本 — 代号“Yukon”的 Beta 1 版引入了许多对 T-SQL 的功能增强和新增功能,可以提高您的表达能力、错误管理水平和性能。本文中,我将讨论一些重要的功能增强和新功能,包括错误处理、递归查询和隔离。我将把注意力主要放在错误管理和相关的改进,并简要描述其他方面的功能增强。www.iTbulo.com-ZO8xOW1

除了这里叙述的功能以外,T-SQL 还有许多其他重要功能增强我没有深入探讨,因为其中一些从概念上讲并不新,而另一些又需要单独讨论。这些方面包括消息处理和服务代理平台,分区和 XML 的功能增强。(有关 Yukon 中 XML 功能增强的更多信息,请参阅本期中 Bob Beauchemin 撰写的“XML in Yukon: New Version Showcases Native XML Type and Advanced Data Handling”一文。)www.iTbulo.com-ZO8xOW1

错误处理

SQL Server Yukon Beta 1 为在 T-SQL 中进行错误处理引入了新的 TRY/CATCH 构造。此构造可以用于捕获事务中止错误,甚至是在 SQL Server 以前的版本中会引起批处理中止的错误(转换错误、死锁等)。新的构造无法处理的错误类型是那些会导致会话中止的错误(通常是严重度为 21 和更高的错误,如硬件错误)。通常,您的错误处理代码如图 1 中所示。www.iTbulo.com-ZO8xOW1

XACT_ABORT 设置打开了,这样 SQL Server 可以将任何错误当作事务中止错误,从而使其能够被捕获和处理。在 TRY 块内,任何在显式事务内出现的错误会使控制权传递给紧跟在 TRY 块之后的 CATCH 块。如果没有错误出现,则跳过 CATCH 块。如果想研究所发生错误的类型并相应地做出反应,必须将 @@error 的返回值保存到位于 CATCH 块开始处的一个变量中,然后再开始研究。否则 @@error 返回的值可能不正确,因为除了 DECLARE 之外的任何语句都能够更改它。www.iTbulo.com-ZO8xOW1

当事务中止错误发生在位于 TRY 块里的事务内且控制权传递给 CATCH 块时,事务就进入了注定失败的状态。在您显式地发出一个 ROLLBACK 命令之前,锁是不会释放的,已经持续存储的工作也无法逆转。在发出 ROLLBACK 之前,不允许启动任何需要打开隐式或者显式事务的操作。您可以检查导致了错误的事务中已经更改的资源的内容,这样可以看到什么发生了更改,但是必须发出一个 ROLLBACK,以采取需要发生事务的补救措施。请注意,为了捕获 CATCH 块内出现的错误,必须在嵌套 TRY/CATCH 构造内编写代码。为了看一个更详细的示例,我们首先创建一个 ErrorLog 表(其中错误处理代码要对注释进行审核),然后创建 T1 和 T2 表,对它们发出查询,如我用图 2 的代码所完成的功能那样。www.iTbulo.com-ZO8xOW1

接下来,在新的连接(称为连接 1)中运行图 3 中的脚本(称为脚本 1)。脚本 1 将锁的超时设定设置为 30 秒并将死锁优先级设置为低,从那么它在一个死锁情况中自愿成为一个按正常优先级运行的进程发生死锁的牺牲品。TRY 块中的代码更新了 T1,等待 10 秒,然后从 T2 选择。如果事务无错误地完成,将在 ErrorLog 表中插入一行,其中有一个注释表明它成功完成。www.iTbulo.com-ZO8xOW1

CATCH 块设计成捕获主键冲突错误、锁的超时设定到期和重试逻辑的死锁错误。您可以通过更改赋给位于代码开始处的变量 @retry 的值,重新设置所需的重试次数,现在这个值被设置为 2。www.iTbulo.com-ZO8xOW1

在第一次运行图 3 中的代码之后,查看 ErrorLog 的内容。请注意事务成功完成了。要测试是否发生主键冲突错误,打开一个新的连接(称为连接 2)并运行以下代码:www.iTbulo.com-ZO8xOW1



文章评论

共有 0人发表了评论 查看完整内容

推荐教程

最新教程