加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 14:57:18 所属栏目:MsSql教程 来源:网络整理
导读:为什么要用游标呢?数据量超过1万,游标就很慢了。 在很多场合,用临时表或表变量也可以替代游标 临时表用在表没有标识列(int)的情况下. 在表有标识列(int)的情况下可以用表变量,当然也可以用临时表. 利用临时表或表变量的原因时,生成一个连续的列 对于临时表


代码举例:


?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

为什么要用游标呢?数据量超过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...

--------- 存储过程的循环和临时表
    推荐文章
      热点阅读