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

临时表用在表没有标识列(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,1),StyleID varchar(50))----创建临时表

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

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

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

3、循环的用法

以下为程序代码:

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

sqlserver临时表或表变量代替游标的更多相关文章

  1. sqlserver 临时表、表变量、CTE的比较

    原文地址:  sqlserver 临时表.表变量.CTE的比较 1.临时表 1.1 临时表包括:以#开头的局部临时表,以##开头的全局临时表. 1.2 存储 不管是局部临时表,还是全局临时表,都会放存 ...

  2. SqlServer 临时表、表变量、函数 替代游标

    http://www.cnblogs.com/chongzi/archive/2011/01/19/1939106.html 临时表 存放在tempdb中 --存储过程中将多表连接结果写入到临时表中, ...

  3. SqlServer 临时表 与 表变量(转)

    1. 表变量 变量都以@或@@为前缀,表变量是变量的一种,另外一种变量被称为标量(可以理解为标准变量,就是标准数据类型的变量,例如整型int或者日期型DateTime).以@前缀的表变量是本地的,因此 ...

  4. 转:sqlserver 临时表、表变量、CTE的比较

    1.临时表 1.1 临时表包括:以#开头的局部临时表,以##开头的全局临时表. 1.2 存储 不管是局部临时表,还是全局临时表,都会放存在tempdb数据库中. 1.3 作用域 局部临时表:对当前连接 ...

  5. SQL 临时表或表变量替代游标

    1.如果表没有自动增长的标识列(int) 使用临时表 SELECT IDENTITY(int) NewID ,.. INTO #tmp FROM YouTable 2.表有标识列 使用表变量 INSE ...

  6. SQL 临时表或表变量替代游标(转)

    1.如果表没有自动增长的标识列(int) 使用临时表 SELECT IDENTITY(int) NewID ,.. INTO #tmp FROM YouTable 2.表有标识列 使用表变量 INSE ...

  7. SQLServer中临时表与表变量的区别分析(转)

    在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢? 临时表 临时表与永 ...

  8. SQLServer中临时表与表变量的区别分析

    临时表 临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在.临时表在创建的时候都会产生SQL Server的系统日志 ...

  9. SQLServer中临时表与表变量的区别分析【转】

    在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢? 临时表 临时表与永 ...

随机推荐

  1. 深度学习实战-----0001(移植反向传播Python to c++)

    1. https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/  老外教程 2. https://github. ...

  2. 洛谷P1306 斐波那契公约数

    题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少? 输入输出格式 输入格式: 两个正整 ...

  3. 老罗关于binder的链接

    Android进程间通信(IPC)机制Binder简要介绍和学习计划 : http://blog.csdn.net/luoshengyang/article/details/6618363

  4. gradle 命令行

    1. 帮助 ./gradlew -h 2. gradle 可执行tasks gradle tasks or ./gradlew tasks 3. gradle help 任务 帮助了解每个task 的 ...

  5. 在WORD2007中添加修改组件

    从网上查到这个,但不知道怎么设置选项内容,及如何出现选项.能否详细说明下,谢谢!1).在开始操作前,请先点击窗口左上角的office按钮,打开word选项,在常规窗口中,勾选在功能区显示开发工具选项卡 ...

  6. 使用 ip 进行系统网络配置

    检查是否有安装iproute工具 rpm -qa | grep iproute 查看所有可用接口 ip link show 启用或禁用接口 ip link set down eth1 ip link ...

  7. VS下QT的自定义槽函数修改方法

    通过几天的摸索,基本发现了两个VS的槽函数的修改方法 一种是UI是通过UI 设计师拖出来的,类似VB的方法,通过拖的方法,按钮的代码是系统自动生成的,在UI.h的头文件下,这个时候,实现槽函数有个固定 ...

  8. iSCSI存储的3种连接方式

    我们分析了iSCSI存储的系统结构,下面来看iSCSI是如何与服务器.工作站等主机设备来连接的,也就是我们如何建立一个iSCSI网络存储系统. iSCSI设备的主机接口一般默认都是IP接口,可以直接与 ...

  9. 好用的一个object c 宏

    好用的一个object c 宏 from https://github.com/justzt/ios-helper/blob/master/Macro.h // // Macro.h // Photo ...

  10. Oracle日常性能问题查看

    1 判断回滚段竞争的sql --当Ratio大于2时存在回滚段竞争,需要增加更多的回滚段) ratio from v$rollstat rs, v$rollname rn where rs.USN = ...