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

临时表用在表没有标识列(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. 拦截器springmvc防止表单重复提交【1】

    [参考博客:http://www.cnblogs.com/hdwpdx/archive/2016/03/29/5333943.html] springmvc 用拦截器+token防止重复提交 首先,防 ...

  2. LibreOJ β Round #2 题解

    LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq ...

  3. 【ASP.NET Web API2】Digest认证

    Digest摘要认证 对于Basic认证方案来说,被传输的认证凭证仅仅采用Base64编码,所以包含密码的认证凭证基本上可以视为明文传输.Digest认证在此基础上进行了改善,在一定程度上提高了安全系 ...

  4. [樹莓派]用mkusb来制作U盘启动安装Ubuntu 15.04

    之前實踐過這文章的描述,還可以成功:http://www.linuxdiyf.com/linux/12719.html,轉記錄餘下: 官方英文文档,教你在Ubuntu 15.04下使用mkusb来制作 ...

  5. Rancher使用入门

    http://tonybai.com/2016/04/14/an-introduction-about-rancher/

  6. selenium - css 定位

    前言: CSS(Cascading Style Sheets)是一种语言,它被用来描述 HTML 和 XML 文档的表现. CSS 使用选择器来为页面元素绑定属性.这些选择器可以被 selenium ...

  7. 平均分割list

    private static List<List<Integer>> splitList(List<Integer> lists,int limit){ int s ...

  8. Google Cloud VM上在线扩硬盘

    Google Cloud VM是可以在线扩展Disk的大小的. 一.创建VM和磁盘 比如我有一台VM,附加了一块Disk,大小是120GB.如下图: 在VM中进行格式化: mkfs.ext4 -F / ...

  9. Java-Maven-Runoob:Maven Web 应用

    ylbtech-Java-Maven-Runoob:Maven Web 应用 1.返回顶部 1. Maven Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的 ...

  10. C++11 变量和函数的链接性

    在全局变量前添加const或者static,则该变量链接性为内部,即文件内有效.可以使用extern声明为外部. 如果要让函数的链接性为内部,则函数声明和定义都应使用static关键字. 例子: te ...