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


     

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

    临时表用在表没有标识列(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

  • 相关阅读:
    面向对象的三个基本特征(讲解)
    GridView 72般绝技
    Asp.net 将数据库里的记录转换成json
    jquery json asp.net 将各种对象:list ..等转换成
    sql2000 分页存储过程
    .NET中DataSet转化Json工具类
    从攻击者痕迹看内网常见命令
    从攻击者角度看SetMpreference小结
    Java NIO 实现服务端和客户端的通信示例
    spark streaming 监听器执行顺序
  • 原文地址:https://www.cnblogs.com/lykbk/p/fgfghtht454454.html
Copyright © 2020-2023  润新知