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

日期: 2008-06-29 作者:Alizze 来源:TechTarget中国

  一、ITERATOR(迭代)

  这种模式提供一种在相似对象列表中遍历对象的标准化方法。在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将在它的结果代码中返回错误码。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

Alizze
Alizze

相关推荐