功能强大的全新T-SQL语法极大地提升了的可性
2008-04-28 12:58
190 查看
SQLServer下一版本—代号“Yukon”的Beta1版引入了许多对T-SQL的功能增强和新增功能,可以提高您的表达能力、错误管理水平和性能。本文中,我将讨论一些重要的功能增强和新功能,包括错误处理、递归查询和隔离。我将把注意力主要放在错误管理和相关的改进,并简要描述其他方面的功能增强。
除了这里叙述的功能以外,T-SQL还有许多其他重要功能增强我没有深入探讨,因为其中一些从概念上讲并不新,而另一些又需要单独讨论。这些方面包括消息处理和服务代理平台,分区和的功能增强。(有关Yukon中XML功能增强的更多信息,请参阅本期中BobBeauchemin撰写的“XMLinYukon:NewVersionShowcasesNativeXMLTypeandAdvancedDataHandling”一文。)
错误处理
SQLServerYukonBeta1为在T-SQL中进行错误处理引入了新的TRY/CATCH构造。此构造可以用于捕获事务中止错误,甚至是在SQLServer以前的版本中会引起批处理中止的错误(转换错误、死锁等)。新的构造无法处理的错误类型是那些会导致会话中止的错误(通常是严重度为21和更高的错误,如错误)。通常,您的错误处理代码如图1中所示。XACT_ABORT设置打开了,这样SQLServer可以将任何错误当作事务中止错误,从而使其能够被捕获和处理。在TRY块内,任何在显式事务内出现的错误会使控制权传递给紧跟在TRY块之后的CATCH块。如果没有错误出现,则跳过CATCH块。如果想研究所发生错误的类型并相应地做出反应,必须将@@error的返回值保存到位于CATCH块开始处的一个变量中,然后再开始研究。否则@@error返回的值可能不正确,因为除了DECLARE之外的任何语句都能够更改它。
当事务中止错误发生在位于TRY块里的事务内且控制权传递给CATCH块时,事务就进入了注定失败的状态。在您显式地发出一个ROLLBACK命令之前,锁是不会释放的,已经持续存储的工作也无法逆转。在发出ROLLBACK之前,不允许启动任何需要打开隐式或者显式事务的操作。您可以检查导致了错误的事务中已经更改的资源的内容,这样可以看到什么发生了更改,但是必须发出一个ROLLBACK,以采取需要发生事务的补救措施。请注意,为了捕获CATCH块内出现的错误,必须在嵌套TRY/CATCH构造内编写代码。为了看一个更详细的示例,我们首先创建一个ErrorLog表(其中错误处理代码要对注释进行审核),然后创建T1和T2表,对它们发出查询,如我用图2的代码所完成的功能那样。
接下来,在新的连接(称为连接1)中运行图3中的脚本(称为脚本1)。脚本1将锁的超时设定设置为30秒并将死锁优先级设置为低,从那么它在一个死锁情况中自愿成为一个按正常优先级运行的进程发生死锁的牺牲品。TRY块中的代码更新了T1,等待10秒,然后从T2选择。如果事务无错误地完成,将在ErrorLog表中插入一行,其中有一个注释表明它成功完成。
CATCH块成捕获主键冲突错误、锁的超时设定到期和重试逻辑的死锁错误。您可以通过更改赋给位于代码开始处的变量@retry的值,重新设置所需的重试次数,现在这个值被设置为2。
在第一次运行图3中的代码之后,查看ErrorLog的内容。请注意事务成功完成了。要测试是否发生主键冲突错误,打开一个新的连接(称为连接2)并运行以下代码:
INSERTINTOT1VALUES(3)回到连接1并再次运行脚本1。如果查看ErrorLog的内容,应该可以看到其中记录了一个主键冲突错误。转到连接2并通过运行以下命令删除刚插入的行:
DELETEFROMT1WHEREcol1=3要测试锁的超时设定是否到期,在连接2中运行以下代码:
BEGINTRANUPDATET1SETcol1=1回到连接1并再次运行脚本1。在大约30秒后,应该出现一个错误。查看ErrorLog的内容,可以发现记录了一条锁的超时设定到期。转到连接2并发出一条ROLLBACK命令以回滚事务。
为了测试是否存在死锁,到连接2并粘贴以下代码,但是暂时不运行:
DECLARE@iASINTBEGINTRANSET@i=1WHILE@i<=2BEGINUPDATET2SETcol1=2WAITFORDELAY'00:00:10'SELECT*FROMT1WAITFORDELAY'00:00:05'SET@i=@i+1ENDROLLBACK转到连接1,运行脚本1中的代码,然后立即运行连接2中的代码。大约一分钟之后,您将看到连接1中出现错误。查看ErrorLog的内容可以注意到在死锁错误之后进行了两次重试尝试,第三次尝试成功了,没有发生错误。查询ErrorLog表并查看其内容。
最后,如果想要在TRY块内引发您自己的事务中止错误,您可以使用TRAN_ABORT选项调用RAISERROR命令。
1
相关文章推荐
- 功能强大的全新 T-SQL 语法极大地提升了 SQL Server 的可编程性
- sql的强大功能(看一条sql解决的复杂业务)
- SQL比较工具SQL Compare v12发布,全新UI界面,新增登陆授权及同时注册功能
- 今天到Microsoft SQL Server网站看了一下, 觉得SQL2005的功能好强大约
- 解密Apache HAWQ ——功能强大的SQL-on-Hadoop引擎 [作者:常雷]
- SQL优化:采用新语法提升分页性能(本质上就是新的算法)
- 潜移默化学会WPF(企业经验篇)--全新替代掉VisualHelper功能的类,可视树泛型查找,功能强大
- 功能强大的SQL语句
- HAWQ ——功能强大的SQL-on-Hadoop引擎
- sql的强大功能(看一条sql解决的复杂业务)
- SQL Server Management Object(SMO)大大简化数据库工具的开发 几行代码开发功能强大的SQL工具
- AliSQL 20170716版本发布 Invisible Indexes 功能和 SELECT FROM UPDATE 语法
- sql内置函数pivot强大的行转列功能
- 搜索表单制作语法:强大的搜索功能
- 将正则表达式匹配的强大功能带给 SQL
- 用 SQL Server CE 2.0 和.NET Compact Framework 开发紧凑而功能强大的移动应用程序
- SQL中CASE语句强大功能详解
- 【转】SqlCacheDependency的使用 强大的功能
- sql内置函数pivot强大的行转列功能
- SQL Server 2005的又一强大功能---(SQL Server Integration Services,SSIS)