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

临时表用在表没有标识列(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. 核PCA投影平面公式推导

    样本方差推导 样本方差公式\[S = \frac{1}{n-1}\sum_{i=1}^n(x_i-\mu_i)^2\] 扩展开来得到\[S = \frac{1}{n-1}[(X-\frac{1}{n} ...

  2. bzoj 2435 道路修建

    Written with StackEdit. Description 在 \(W\) 星球上有 \(n\) 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是 ...

  3. 初识ADO.NET

    摘要 作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角色.本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET的主要组成部分 ...

  4. LeetCode Max Stack

    原题链接在这里:https://leetcode.com/problems/max-stack/description/ 题目: Design a max stack that supports pu ...

  5. 洛谷P3585 [POI2015]PIE

    传送门 题目大意:有个n*m的格子图,要求'x'点要被染成黑色 有个a*b的印章,'x'是可以染色的印章上的点. 要求用印章去染色格子 (1)印章不可以旋转. (2)不能把墨水印到纸外面. (3)纸上 ...

  6. centos 7 bbr 安装

    1. 准备 升级内核需要4.9 以及以上   2.  yum  内核升级       a. 添加 ELRepo 源 GPG key rpm --import https://www.elrepo.or ...

  7. Python学习系列(二)(基础知识)

    Python基础语法 Python学习系列(一)(基础入门) 对于任何一门语言的学习,学语法是最枯燥无味的,但又不得不学,基础概念较繁琐,本文将不多涉及概念解释,用例子进行相关解析,适当与C语言对比, ...

  8. JMeter使用经历

    JMeter是Apache大树下的又一个果实,是一个压力测试工具,因为使用方便又开源免费,也被用来做功能测试.项目里也是拿JMeter来做功能性的接口自动化测试.这里大概说明下怎么用. 首先还是先下载 ...

  9. 使用 sysbench对mysql进行压力测试介绍之一

    sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.数据库目前支持MySQL/Oracle/PostgreSQL.本文只是简单演示一下几种测试的用 ...

  10. Effective java笔记3--类和接口2

    三.接口优于抽象类 java提供两种机制,可以用来定义一个允许多个实现的类型:接口和抽象类.由于java只允许单继承,所以,抽象类作为类型定义受到了极大的限制. 已有的类可以很容易被更新,以实现新的接 ...