SQLServer中遍历⽅式——WHILE循环
while循环的语句格式:
while(判断条件语句){
循环体语句;
}
扩展格式:
初始化语句;
while(判断条件语句){
循环体语句;
控制条件语句;
}
⽅法1:使⽤临时表
使⽤临时表,和游标类似,同时将⼤量的数据存储到内存中,但是随着遍历的进⾏,临时表的数据量越来越⼩,可以相当程度的降低内存的消耗,但是需要不停的与table表做交互
-- 创建临时表
SELECT NID,CROWID,LXBM,LDXLH
INTO #T_LD
FROM TMPTABLE1
-- 声明变量
DECLARE
@LDBM AS NVARCHAR(20),
@LDXLH AS NVARCHAR(20),
@LXBM AS NVARCHAR(20),
@CROWID AS NVARCHAR(80),
--@sqlstr varchar(1000),
@NID INT;
WHILE EXISTS(SELECT NID FROM #T_LD)
BEGIN
-- 也可以使⽤top (1)
SET ROWCOUNT 1  --在返回指定的⾏数之后停⽌处理查询,只显⽰第1条记录
SELECT @LXBM=substring(CROWID,1,4),@CROWID=LXBM+'审批流',@nid=nid FROM #T_LD;
print(@nid)
UPDATE tmpTable1 SET CROWID=@CROWID where @nid=NID and CrowId='';
UPDATE tmpTable1 SET LXBM= @LXBM where @nid=NID and LXBM='';
SET ROWCOUNT 0  --关闭该选项,返回所有的⾏
DELETE FROM #T_LD WHERE NID=@nid;
END
DROP TABLE #T_LD
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--判断零时表是否存在,如果存在删除--
if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#tempcitys') and type='U')
drop table #tempcitys
go
--创建零时表
create table #tempcitys
(
id int primary key identity(1,1),
name nvarchar(50)
)
go
--插⼊数据
drop table if exists admin
insert into #tempcitys(name) values('上海');
insert into #tempcitys(name) values('杭州');
insert into #tempcitys(name) values('苏州');
go
-
-遍历零时表
declare @city_name nvarchar(50)
while exists(select name from #tempcitys)
begin
set rowcount 1
select @city_name=name from #tempcitys
print @city_name
set rowcount 0
delete from #tempcitys where name = @city_name
--print @city_name
end
⽅法2:使⽤索引表
索引表和临时表的操作类似;唯⼀区别在于在建⽴临时表是,添加⼀个索引,然后通过此索引从表中取数据;效率上有所提升,但是增加了变量的输出,代码如下
--⽅法3:使⽤索引表
SELECT * FROM TMPTABLE
SELECT * FROM TMPTABLE1
--创建临时表
IF EXISTS(Select Name From Sysobjects Where Name='tmpTable1')
DROP table tmpTable1 --存在则删除
create table tmpTable1(
NID int primary key identity(1,1), --主键,⾃增
CrowId nvarchar(90),
LXBM nvarchar(20),
LDXLH nvarchar(6),
)
--插⼊数据
insert into tmpTable1(CrowId,LXBM,LDXLH)
select CrowId,LXBM,LDXLH from tmpTable
-- 声明变量
DECLARE
@index int,
@countNum int,
@LDBM AS NVARCHAR(20),
@LDXLH AS NVARCHAR(20),
@LXBM AS NVARCHAR(20),
@CROWID AS NVARCHAR(80),
@nid int;
--select * from tmpTable1;
select @countNum=count(1) from tmpTable1;
set @index=0;
--遍历
while @index<@countNum
begin
set @index=@index+1;
select @LXBM=substring(CROWID,1,4),@CROWID=LXBM+'审批流',@nid=nid from tmpTable1 where NID=@index
UPDATE tmpTable1 SET CROWID=@CROWID where @nid=NID and CrowId='';
UPDATE tmpTable1 SET LXBM= @LXBM where @nid=NID and LXBM='';
-- UPDATE tmpTable1 SET LDBM= @LXBM+' '+@LDXLH WHERE CROWID=@CROWID;
end
--删除临时索引表
DROP table tmpTable