喜欢本站并加入收藏
首 页 电脑学园 技术文档 图形图像 办公应用 网页设计 管理资料 PPT模板 方案合同
 位置: 北方教程网 >> 技术文档 >> Mssql >> 正文
   详解T-SQL的十一种设计模式
详解T-SQL的十一种设计模式
[ 作者:佚名   来源:网络整理   点击数:   更新时间:2008-7-2 ]

首先要说明:这种模式提供一种在相似对象列表中遍历对象的标准化方法。在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。

[1] [2] [3] [4]  下一页

上一篇: 分析SQL Server数据备份处理过程 下一篇: 没有了
打印此文  收藏此页  关闭窗口  返回顶部
 相关文章  热点文章
 · 让你的Vista系统自动变换IP地址
 · 九个保障Linux系统安全的注意事项
 · 远程管理Web服务器的方法技巧
 · Win Vista系统自带IIS7.0设置详解
 · Linux系统中常用网络命令小结
 
热 点 图 文
教你节省Vist...
使用Windows ...
 · 让你的Vista系统自动变换IP地址
 · 九个保障Linux系统安全的注意事项...
 · 远程管理Web服务器的方法技巧
 · Win Vista系统自带IIS7.0设置详解...
 · Linux系统中常用网络命令小结
 · 详解Sendmail邮件服务器的安装与...
推 荐 阅 读
Win Vista比X...
用户安全上网...
 · Vista系统组建局域网共享问题分析...
 · 新手如何学会查看计算机的硬件配...
 · 新手必看的二十个电脑使用技巧
 · 没光驱的笔记本电脑如何重新安装...
 · 上网电脑预防病毒的几个方法
 · 新版IE8.0无法输入支付宝密码的解...
 设为首页 - 加入收藏 - 关于本站 - 联系我们 - 广告合作 - 友情链接 - 在线交流 - 
CopyRight© 2006-2009 Eduai.Com All Rights Reserved
在线交流 QQ:524152258 辽ICP备07001851号
免责声明:本站部分资源来自网络,如有侵犯您的版权请通知,我们立即删除。