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