sql-between..and 与大于,相比拼

先说些废话,由于种种原因,导致不想写博客,可能因为工作忙的关系,以后一旦有时间,一定经常来写写,唠叨唠叨:

言归正传,故事即将上演:

  

DECLARE @SysNo int
DECLARE @SumCount int
SET @SysNo=0
SET @SumCount=0
WHILE (1=1)

BEGIN
--先取出top 1 取出一条数据
SELECT TOP 1

@SysNo=SysNo
FROM #tableName# WITH(nolock) WHERE Status='A' AND (type=1 or TYPE=2)
AND SysNo > @SysNo
ORDER BY SysNo ASC

--如果查不到,则退出
IF @@ROWCOUNT = 0 -- @@ROWCOUNT = 0 @SysNo=20
BEGIN

BREAK
END


DECLARE @PositionID int
DECLARE @Num int
DECLARE @Where nvarchar(50)
SET @Num=0
SET @PositionID=70
WHILE(1=1)
BEGIN
SET @Num=@Num+1
SET @Where=N'自定义'+CONVERT(varchar(10),@Num)
--判断是否插入过
IF NOT exists(

SELECT TOP 1 a FROM #table# WITH(nolock)
WHERE Description=@Where
)

BEGIN
--PRINT @Where
INSERT INTO #table#

(
a
,b
,c
,d
,e
,f
,g
,h
)
VALUES
(4,@PositionID,0,@SysNo,@Where,getdate(),'System','A')
SET @PositionID=@PositionID+1
SET @SumCount=@SumCount+1
END

--插入到20个后,停止插入进入下一个品牌
IF(@Num=20)

BREAK
END

--如果插入大于1000条,清0停顿10秒
IF(@SumCount=1000)

BEGIN
SET @SumCount=0
WAITFOR delay '0:0:10'
END


END

 

上面这段代码功能是(改版后的),循环取出#table#中的数据,取出的sysno为后面的循环插入数据做准备。

这里有两个循环,第一个循环由@@Rowcount跳出循环

        第二个循环由@num=20跳出

回忆当时写此SQL代码历程:

1.当时我在想,第一个循环想做成表变量,或者用游标实现,但我想如果用这两者,都会产生额外的开销,故我用下面这段代码

  

SELECT TOP 1 
@SysNo=SysNo
FROM #tableName# WITH(nolock) WHERE Status='A' AND (type=1 or TYPE=2)
AND SysNo not between 0 and @SysNo
ORDER BY SysNo ASC

 

  一看上去,也没啥问题,后来,经过一位同事review代码,结果查出来

用以下代码比用 between..and 要快好多倍,很感谢她。

 

SELECT TOP 1 
@SysNo=SysNo
FROM #tableName# WITH(nolock) WHERE Status='A' AND (type=1 or TYPE=2)
AND SysNo > @SysNo
ORDER BY SysNo ASC

 

 

最后经过多次修改,最后代码完整版本,在最上面。

仅个人总结,仅供参考,如果不足之处,恳请指正。