45IT.COM- 电脑学习从此开始!
DIY硬件教程攒机经验装机配置
设计Photoshop网页设计特效
系统注册表DOS系统命令其它
存储主板显卡外设键鼠内存
维修显卡CPU内存打印机
WinXPVistaWin7unix/linux
CPU光驱电源/散热显示器其它
修技主板硬盘键鼠显示器光驱
办公ExcelWordPowerPointWPS
编程数据库CSS脚本PHP
网络局域网QQ服务器
软件网络系统图像安全
页面导航: 首页 > 设计学院 > 网络编程 > 数据库 >

带你深入了解T-SQL的十一种设计模式

电脑软硬件应用网 45IT.COM 时间:2008-06-25 19:10 作者:Alizze

这种模式提供一种在相似对象列表中遍历对象的标准化方法。在SQL Server数据库中的同义词是游标。

DECLARE tables CURSOR

FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

FOR READ ONLY


DECLARE @table varchar(40)


OPEN tables


FETCH tables INTO @table

WHILE (@@FETCH_STATUS = 0)

BEGIN

EXEC sp_help @table

FETCH tables INTO @table

END


CLOSE tables

DEALLOCATE tables


注:游标的清理代码:在CLOSE后紧跟DEALLOCATE,实际上可以只运行DEALLOCATE,并且游标也能自动关闭。但这不是最自然,也不是最常见的方法。大家可以理解为:CLOSE抵消OPEN,DEALLOCATE与DECLARE则相反,这样可以使代码保持对称并且合乎逻辑。

 

二、INTERSECTOR(交集)

这种模式是表示集合交集的一种模板。

1、推荐方法:

SELECT c.companyname,o.orderid

FROM customer c INNER JOIN orders o ON c.customerid = o.customerid


2、旧式语法(不推荐使用)

SELECT c.companyname,o.orderid

FROM customer c ,orders o

WHERE c.customerid = o.customerid


注:实现集合交集还有许多变种方法。但是惯例方法就是方法1,方法2在实现左(右)联接时,条件的表示及结果都可能出现问题,SQL SERVER的后续版本将会取消此种联接方式。

 

三、QUALIFIER(限定)

限定数据等价于筛选查询所返回的行数。

1、常用法:WHERE子句限定

SELECT city,count(*) AS NumberCity

FROM customers

WHERE city like 'A%'

GROUP BY city

 

2、不自然的筛选:HAVING子句限定

SELECT city,count(*) AS NumberCity

FROM customers

GROUP BY city

HAVING city like 'A%'


注:HAVING子句的目的是在结果集被检索出来后再筛选查询。实际上,SQL SERVER内在地转换HAVING子句为WHERE子句(两种方法查询的执行计划是相同的),如果SQL SERVER不执行此优化,则针对包含大量数据行的表,因需要在筛选前从表中检索所有行,则性能方面可能会遭受重大损失。


四、EXECTOR(运行)

提供创建并执行动态T-SQL字符串的模板


--中断除当前连接之外的所有用户连接

DECLARE @s int,@sql nvarchar(128)

DECLARE spids CURSOR FOR

SELECT spid

FROM master..sysprocesses

WHERE spid <> @@SPID AND net_address<>''

FOR READ ONLY


OPEN spids

FETCH spids INTO @s

WHILE (@@FETCH_STATUS = 0)

BEGIN

SET @sql = 'KILL ' + CAST(@s AS varchar)

EXEC sp_executesql @sql

FETCH spids INTO @s

END


CLOSE spids

DEALLOCATE spids


注:上述语句中的sp_executesql可以用exec()替换,但推荐使用sp_executesql,因为与exec()相比,sp_executesql支持参数化查询,并可从动态T-SQl调用返回一个结果代码。如果动态代码产生一个严重级达到或超过11的错误,sp_executesql将在它的结果代码中返回错误码。

 


五、Conveyor(传送)

提供一种通过存储过程链传送信息的机制。与GoF的责任链模式(Chain of Responsibility)相类似。

1、传送返回码

CREATE PROC procC

AS

IF OBJECT_ID('no_exist') IS NOT NULL

SELECT * FROM no_exist

ELSE

RETURN (-1)

GO


CREATE PROC procB

AS

DECLARE @res int

EXEC @res = procC

RETURN (@res)

GO


CREATE PROC procA

AS

DECLARE @res int

EXEC @res = procB

SELECT @res

GO


EXEC procA


注:上述代码使用了存储过程的结果代码从过程向过程传递原始返回码的方法,即A调用B,B又调用C,C运行时如出现了错误,则将错误代码-1传送给A。


2、通过输出参数传送消息

CREATE PROC procC

@msg varchar(128) OUT

AS

IF OBJECT_ID('no_exist') IS NOT NULL

SELECT * FROM no_exist

ELSE

SET @msg = 'Table dosen''t exist!'

GO


CREATE PROC procB

@msg varchar(128) OUT

AS

EXEC procC @msg OUT

GO


CREATE PROC procA

AS

DECLARE @msg varchar(128)

EXEC procB @msg OUT

SELECT @msg

GO


EXEC procA


注:可以使用任何数据类型(包括游标)来返回任何想要的信息


3、传送真实错误代码

CREATE PROC procC

AS

DECLARE @err int

IF @@TRANCOUNT = 0 --此全局变量返回当前连接的活动事务数

ROLLBACK TRAN --有意设置的出错语句,因未使用BEGIN TRANSACTION语句

SET @err = @@ERROR

RETURN (@err)

GO


CREATE PROC procB

AS

DECLARE @res int

EXEC @res = procC

RETURN (@res)

GO


CREATE PROC procA

AS

DECLARE @res int

EXEC @res = procB

SELECT @res

GO


EXEC procA


六、Restorer(恢复)

此模式提供一种在出错时清理资源的机制。为避免孤立一个事务,当事务活动时,适当地处理出错条件极其重要。

1、出错时回滚事务

IF OBJECT_ID('procR') IS NOT NULL

DROP PROC procR

GO


CREATE PROC procR

AS

DECLARE @err int


BEGIN TRAN


UPDATE customers SET city = 'Dallas'

SELECT 1/0 --设置一个错误

SET @err = @@ERROR


IF @err <> 0

BEGIN

ROLLBACK TRAN

RETURN (@err)

END


COMMIT TRAN

GO


DECLARE @res int

EXEC @res = procR

SELECT @res


注:此模式的关键部分是将错误码@@error缓存至变量@err中,如果不缓存@@error,下一执行成功的语句将重置@@error,缓存它后,如出现错误,将检查@errr的值并回滚该活动事务。


2、出错时清除临时表

CREATE PROC procR

AS

DECLARE @err int


CREATE TABLE ##myglobal(c1 int)


INSERT ##myglobal DEFAULT VALUES


SELECT 1/0 --设置一个错误

SET @err = @@ERROR


IF @err <> 0

BEGIN

DROP TABLE ##myglobal

RETURN (@err)

END


DROP TABLE ##myglobal

GO


DECLARE @res int

EXEC @res = procR

SELECT @res

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
无法在这个位置找到: baidushare.htm
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐知识