zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    linux 命令——48 watch (转)
    linux 命令——47 iostat (转)
    linux 命令——46 vmstat(转)
    linux 命令——45 free(转)
    linux 命令——44 top (转)
    linux 命令——43 killall(转)
    linux 命令——42 kill (转)
    linux 命令——41 ps(转)
    linux 命令——40 wc (转)
    Java for LeetCode 068 Text Justification
  • 原文地址:https://www.cnblogs.com/lykbk/p/fgfghtht454454.html
Copyright © 2011-2022 走看看