方法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;
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
--插入数据
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