在很多场合,用临时表或表变量也可以替代游标
临时表用在表没有标识列(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), AS declare @Kh_ID varchar(50)-----存放考核子指标值 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) set @total = 0 ---累计初始化 while (@i <= @count) -------开始循环 select @zb_count=count(*) from v_kh_jg where J_ID=@J_JID and K_ID=@Kh_ID and S_Area in (select * if @zb_count = 0 select @total= @zb_count +@total ---累计 select @i = @i +1 --循环递增 set @zb_count=@total set @zb_count=0 drop table #KhStyle---删除临时表 |
说明:我这里用到了临时表的功能,通过这个存储过程至少能学到三点知识
1、变量是如何定义的
以下为程序代码:
declare @intID int declare @varname varchar(100) |
2、临时表的使用
以下为程序代码:
Create Table #StyleTab(intID int identity(1,1),StyleID varchar(50))----创建临时表 请注意格式:#表名(字段名称 类型,字段名称 类型) 比较有用的一个字段就是自动增长的标识性字段的定义 intID int identity(1,1) Drop Table #StyleTab----删除临时表 |
3、循环的用法
以下为程序代码:
一般i通常作为变量
while(i<=5)
begin
-----代码
end