微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver临时表或表变量代替游标

为什么要用游标呢?数据量超过1万,游标就很慢了。

在很多场合,用临时表或表变量也可以替代游标

临时表用在表没有标识列(int)的情况下.

在表有标识列(int)的情况下可以用表变量,当然也可以用临时表.

利用临时表或表变量的原因时,生成一个连续的列
对于临时表是使用
SELECT ....,IDENTITY(int) NewID INTO #tmp SELECT ... FROM YourTable

对于YourTable含有标识列(比如字段名为ID)时,可以
INSERT @tmpTable
SELECT ...,NewID=(SELECT COUNT(*) FROM YourTable b WHERE b.id<=a.id) FROM YourTable a

当然,也可以不写入表变量而使用子查询.

当有了从 1--你的记录数连续的NewID时,你就可以用循环来操作每一条记录了.
这个NewID你就可以当它是指针标识.
DECLARE @i INT,@cnt INT
SET @i=1
SELECT @cnt=COUNT(*) FROM YourTable
WHILE @i<@cnt
     BEGIN
           SELECT .... FROM #tmp(或@tmpTable依上面情况不同) WHERE NewID=@i
           ...
           SET @i=@i+1
     END

DROP TABLE...

---------
存储过程的循环和临时表


代码举例:


 

CREATE PROCEDURE get_zb_count_3 

@J_JID varchar(50), 
@S_Area varchar(6000), 
@K_ID varchar(50), 
@zb_count int output 

AS 
begin 
declare @i int ---存放循环变量 
declare @count int ---存放表的数据记录数 

declare @Kh_ID varchar(50)-----存放考核子指标值 
declare @total int ------存放count的循环累计 


create table #KhStyle(IntID int identity(1,1),StyleID varchar(50)) ---创建临时表 

insert into #KhStyle(StyleID) select K_ID from T_Kaoh where J_JID=@J_JID and K_FID=@K_ID --------把查询的子指标记录插入到临时表 


select @count = count(1) from #KhStyle ---查询当前临时表的子指标记录 

if (@count>0) 
-------------------------------------------------1---------------------------------- 
begin 
set @i = 1 -------变量初始化 

set @total = 0 ---累计初始化 

while (@i <= @count) -------开始循环 
--------------------------------------------2-------------------------- 
begin 
select @Kh_ID = StyleID from #KhStyle where intID = @i --循环把临时表的子指标值 给于变量 @Kh_ID 

select @zb_count=count(*) from v_kh_jg where J_ID=@J_JID and K_ID=@Kh_ID and S_Area in (select * from GetTB(@S_Area)) -----当前子指标所属企业数 

if @zb_count = 0 
select @zb_count = 1 ---如果没有企业则为1 

select @total= @zb_count +@total ---累计 

select @i = @i +1 --循环递增 
end 
-------------------------------------------2--------------------------- 


set @zb_count=@total 
end 
---------------------------------------------1--------------------------------- 
else 

set @zb_count=0 



drop table #KhStyle---删除临时表 
end 
GO 

说明:我这里用到了临时表的功能,通过这个存储过程至少能学到三点知识

1、变量是如何定义的
以下为程序代码

declare @intID int 
declare @varname varchar(100) 


2、临时表的使用

以下为程序代码

Create Table #StyleTab(intID int identity(1,StyleID varchar(50))----创建临时表 

请注意格式:#表名(字段名称 类型,字段名称 类型) 

比较有用的一个字段就是自动增长的标识性字段的定义 intID int identity(1,1) 

Drop Table #StyleTab----删除临时表 


3、循环的用法

以下为程序代码

一般i通常作为变量 
while(i<=5) 
begin 
-----代码 
end

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐