错误处理一直是T-SQL开发的一个棘手部分。你曾经需要在基于逐个场景的基础上运行每一个语句和处理他们之后手动检查错误。事务管理也很烦琐,因为你得指出你的事务的状态,并恰当的回滚或提交。在SQL Server2005中,微软通过增加Try…Catch块到T-SQL中,提供了一个更新、更强大的错误处理能力。
异常处理很简单;在执行你的代码过程中有意外发生时,例如一个异常,你需要有一个例行方式去处理这个异常。要怎么处理这个异常是由作为开发者的你来决定的。为了增加一个异常处理到你的T-SQL代码中,采用Try…Catch块。
如果你最近用过Visual Studio,你很可能熟悉Try…Catch块的概念。在T-SQL中的执行和它很相似,但是在T-SQL 中,它实际上具有比你在Visual Studio中遇到的全面展开执行更少的选择。要用Try…Catch,把你想运行的T-SQL放到Try块里面。如果在执行Try中的代码过程中发生了一个严重级别为10或更高的错误,执行就会跳转到Catch块里的异常处理代码。基本结构如下所示:
BEGIN TRY (T-SQL代码放在这里) END TRY BEGIN CATCH (异常处理代码放在这里) END CATCH |
ROW_NUMBER函数
SQL Server2005为我们引入了一个ROW_NUMBER函数。你是否曾经需要为你的查询结果集做行序号?你有时会发现能够为行做序号是一件很有用的事情。从前,你不得不作棘手的事,像创建一个有序号列的临时表,然后把你的select结果插入到这个临时表中。现在,用ROW_NUMBER函数,你就可以获得添加在你的结果集的增加列中的行序号。为了获得行序号,你只要简单的将ROW_NUMBER函数作为一列添加进你的select语句中。你还必须添加OVER语句以便告诉SQL Server你希望怎样添加行序号。
select ROW_NUMBER() OVER(ORDER BY employee_id) AS ’Row Number’, * from dbo.employee |
Row Number | employee_id | Firstname | Lastname | soc_sec |
1 | 5623222 | Tim | Jones | 123-65-8745 |
2 | 5632111 | Rob | Kinkad | 456-69-8754 |
3 | 6365666 | Jim | Miller | 236-56-8989 |
4 | 7563333 | Joe | Roberts | 564-89-5555 |
这个查询返回所有的雇员和一个显示每条记录在哪一行的一个序号。OVER语句使SQL Server基于employee_id列增加行序号。换句话说,产生了行序号,就好像数据按employee_id做了排序。这是很重要的一点,因为你仍然可以改变select的排序顺序。以下面的查询为例:
select ROW_NUMBER() OVER(ORDER BY employee_id) AS ’Row Number’, * from dbo.employee ORDER BY soc_sec |
Row Number | employee_id | Firstname | Lastname | soc_sec |
1 | 5623222 | Tim | Jones | 123-65-8745 |
3 | 6365666 | Jim | Miller | 236-56-8989 |
2 | 5632111 | Rob | Kinkad | 456-69-8754 |
4 | 7563333 | Joe | Roberts | 564-89-5555 |
注意第二个结果集数据是按社会安全编号来排序的,但是行号仍然创建得好像数据是按employee_id排序的。
数据定义语言(DDL)触发器
触发器很久以来就是T-SQL特性的一部分,现在他们的作用被扩大了。在SQL Server2005中,微软提供了数据定义语言(DDL)触发器。DDL触发器,就像名字所暗示的,可以配置为当在SQL Server 中DDL活动发生时它就会执行。DDL语句是由任何你在SQL Server数据库中使用的修改、创建或删除对象的命令组成。一般情况下,大多数DDL语句以create、alter或drop开头。利用DDL触发器,你可以选择无论任何时候只要一个用户发出drop TABLE命令就运行某一脚本。
在SQL Server的旧版本里一个相当普遍的练习是创建schema绑定基于你的所有生产表的视图,以防止意外删除一个生产表。因为视图是schema绑定的,删除操作会失败。这要求管理员做额外步骤去删除一个表;他们首先要删除一个视图。现在你可以利用DDL触发器来完成同样的目标,并且这个解决方案工作区比较小。你可以建立一个DDL触发器以alter或drop TABLE语句开头,这样可以防止这个语句的完成。这又增加了一个额外的保护层,因为这个触发器需要在改动之前被删除掉或设为不可用。
DDL触发器还具有非常显著的审计用途。触发器可以用来记录任何时候的表、存储过程或视图的增加、修改或删除的细节日志。不用再猜测是谁增加了一个新对象。真的,你用DDL触发器可以做的事是没有任何限制的。
公共语言运行库集成
SQL Server2005的T-SQL新特性是完全具有写和利用公共语言运行库(CLR)模块的能力,它可以集成到你的数据库中。CLR集成允许它写触发器、存储过程、函数、聚合函数和以.NET语言编写的类型。在你为此疯狂和开始用CLR重写所有东西之前,要警告你:花点时间仔细考虑哪些对象应该采用CLR。某些工作采用CLR很适合但有些则不行。如果你需要和操作系统交互,很可能就该采用公共语言运行库。另外,字符串解析或排序的复杂的运算法则如果采用CLR很可能执行性能会更好。然而,标准的T-SQL语句,像insert,update和delete还是留在T-SQL中好些。只用常识和性能测试任何你写的东西。
写CLR的复杂性超出了本篇文章的范围,但是我将给你一个高度见解。你需要采用Visual Studio以你选择的.NET语言来写存储过程。一旦你写了,粘贴代码作为一个部件然后创建这个存储过程、函数、触发器或类型——然后将它指向这个部件。除此以外,它可以就像传统的T-SQL对象一样被调用或被使用。在我们的专家回答区你可以获得一个对CLR例程方法和T-SQL存储过程间的差异的总的概括。
SQL Server2005中有许多改动,并不只是在T-SQL方面。我们当然没有在这片文章里涵盖所有的内容,但是这些已经是新增内容里的一些最吸引人的内容了。花些时间探讨这些新特性——你最好赶快。SQL Server的下一版本即将发布,我肯定它将包含更多的新功能。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
SQL Server 2016新变化:内存中OLTP功能大改进
SQL Server 2016的许多功能得到改进,内存中OLTP(in-memory OLTP)也不例外,包括扩展性、性能以及扩展T-SQL用于使用和管理内存优化表的功能方面。
-
优化T-SQL提升SQL Server数据库性能
本文中提供了八种优化T-SQL代码避免SQL Server数据库性能瓶颈的技巧,我们可以据此优化数据库应用。
-
配置SQL Server数据库恢复模式的两种方法
本文我们讨论了配置SQL Server恢复模式的两种方式,用T-SQL或者SQL Server管理工具都可以修改恢复模式的设置。
-
用T-SQL在SQL Server 2012中创建用户自定义角色
SQL Server 2012中引入了两项功能,即创建用户自定义服务器角色和分配服务器级别的权限。本文为初级DBA给出了一个用户自定义服务器角色的示范用例。