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

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

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 <script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
阅读更多
上一篇托管UDT使您能够扩展的类型系统
下一篇2005数据转换服务的常见问题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭