MSSQL各种写法的效率问题

核心提示:经常可以遇到这种情况:用不同的SQL写法可以达到同样的目的

澳门新葡亰手机版 1澳门新葡亰手机版 2代码

经常可以遇到这种情况:用不同的SQL写法可以达到同样的目的。爱钻牛角尖的人就想搞明白,诚然结果一样,但到底孰优孰劣?下面是我列出的一些,请兄弟们赐教。也请兄弟们将你们遇到的类似问题一并列出。

SQLServer 中的回车符与换行符
制表符:CHAR(9)  换行符:CHAR(10)  回车符:CHAR(13)
1、将 varchar 值作为条件,查询Where Id in 列表的值 
declare @a varchar ( 100 )
set @a = ‘56,58’   
— 正确的: 
select * from tb where charindex ( ‘,’ + ltrim (id) + ‘,’ , ‘,’ + @a + ‘,’ ) > 0 
— 错误的: 
select * from tb where id in + @a 

(1)一次插入多条数据时:CREATE TABLE tb(ID int, 名称 NVARCHAR(30), 备注
NVARCHAR(1000))INSERT tbSELECT 1,DDD,1UNIONALLSELECT
1,5100,DUNIONALLSELECT 1,5200,E

2、找出与某id相近的四条记录
Create table tb(id int ,cName char ( 10 ))
DECLARE @ID INT         
SET @ID = 7 
SELECT * FROM TB A WHERE id in 
( SELECT TOP 4 id FROM TB ORDER BY ABS (id – @id ))
ORDER BY ID 

也可以这样:CREATE TABLE tb1(ID int, 名称 NVARCHAR(30), 备注
NVARCHAR(1000))INSERT TB1 (ID,名称,备注)VALUES(1,DDD,1)INSERT TB1
(ID,名称,备注)VALUES(1,5100,D)INSERT TB1
(ID,名称,备注)VALUES(1,5200,E)_________________________________上面两种方法,哪种方法效率高?

3、按名称,规格分组,将单价数据合并成一行,并计算数量
Create table [tb] (tName varchar(4), [tSize] varchar (7), [ tPrice ] int , [ tQty ] int )
insert [ tb ] 
select ‘高瓦’ , ‘880*110’  , 22 , 1 union all select ‘高瓦’ , ‘880*110’ , 25 , 1 union all 
select ‘高瓦’ , ‘880*110’ , 22 , 1 union all select ‘高瓦’ , ‘880*120’ , 22 , 1 

(2)赋值时:SELECT @a=NaaSET
@a=Naa_________________________________上面两种方法,哪种方法效率高?

select   tName, tSize,
  tPrice = stuff (( select ‘,’ + ltrim (tPrice) from tb  
     where tName = t.tName and tSize = t.tSize FOR XML PATH(”)),1,1,”), sum(tQty)
as tQty
from   tb t group by   tName, tSize 
—结果—————————– 
tName   tSize     tPrice     tQty
高瓦    880*110    22,25,22  3
高瓦    880*120    22        1 

(3)取前几条数据时set ROWCOUNT 2 select * from tb order by fdselect Top
2 * from tb order by
fd_________________________________上面两种方法,哪种方法效率高?

4、根据出生日期,计算出准确的年龄 
澳门新葡亰手机版,SET @A = ‘2008-08-12’ 
DECLARE @A DATETIME 
SELECT 年龄 = 
case when datediff(day,dateadd(year,datediff(year,@A,getdate()),@A), getdate())>= 0 
      then datediff(year,@A,getdate()) else datediff(YY,@A,getdate())- 1 end 

(4)条件判断时where 0(select count(*) from tb where ……)where
exists(select * from tb where ……)
_________________________________上面两种方法,哪种方法效率高?

5、找出某目录列表中所有下级目录,包括自己

(5)NULLIF的使用—–同理它的反函数ISNULL的使用update tb set fd=case when
fd=1 then null else fd endupdate tb set
fd=nullif(fd,1)_________________________________上面两种方法,哪种方法效率高?

澳门新葡亰手机版 3澳门新葡亰手机版 4代码

(6)从字符串中取子字符串时substring(abcdefg,1,3)left(abcderg,3)_________________________________上面两种方法,哪种方法效率高?

DECLARE @FolderList varchar ( 800 )
SET @FolderList = ‘1’ 
SET NOCOUNT ON 
    CREATE TABLE # Temp (FolderId int )    
    INSERT # Temp 
    SELECT FolderId FROM Doc_Folder
    WHERE CHARINDEX ( ‘,’ + LTRIM (FolderId) + ‘,’ , ‘,’ + @FolderList + ‘,’ ) > 0     
    WHILE @@Rowcount > 0 
    BEGIN 
        INSERT # Temp SELECT FolderId FROM Doc_Folder AS A WHERE 
            EXISTS ( SELECT 1 FROM # Temp AS B WHERE B. [ FolderId ] = A.ParentFolderId)
            AND NOT EXISTS(SELECT 1 FROM # Temp AS B WHERE B. [FolderId] = A.[FolderId])
    END 

(7)EXCEPT和Not in的区别?

 

(8)INTERSECT和UNION的区别?下面是邹老大的回答:

6、简单静态游标

(1)一次插入多条数据时:

澳门新葡亰手机版 5澳门新葡亰手机版 6代码

第1种好一些, 但也得有个, 因为第1种的union all是做为一个语句整体,
查询优化器会尝试做优化, 同时, 也要先算出这个结果再插入的.

DECLARE product_cursor CURSOR STATIC FOR 
SELECT cName FROM Product 
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO @product
WHILE @@FETCH_STATUS = 0
BEGIN
 SELECT @message = ‘ ‘ + @product
 PRINT @message
 FETCH NEXT FROM product_cursor INTO @product
END
CLOSE product_cursor
DEALLOCATE product_cursor