zoukankan      html  css  js  c++  java
  • MSSQL 临时表学习

     在家学习下MSSQL的零食表玩法 通过一个存储过程 因为不知道怎么怎么在存储过程里动态调用SQL 所以不得不想另想办法 所以想到了临时表的办法 其关键点就是在得到的条数数据储存到临时表中然后再读取临时表 从而达到获取全部条数的目的 其中也学到了不少新东西

    1.临时表的判断存在的写法  (临时表表名 #tt)

    if(exists(select * from tempdb..sysobjects where id = OBJECT_ID('tempdb..#tt') ) ) 

    2.临时表的概念

    可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。
    本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。

    一般都是用本地临时的(#) 其他人看不到 创建方法和创建表一样只是表名前面有个#

    3.存储过程中动态执行SQL的函数 sp_executesql 记得动态SQL的变量类型不能为varchar 必须是N开头的 例如nvarchar

    exec sp_executesql  @sqllen, N'@TotleCount int output',@TotleCount output 

    原版用临时表实现的结果

    if(exists(select * from sysobjects where id= OBJECT_ID('procTest') ))
    begin
    drop proc procTest
    end

    go
    create proc procTest
    @FeeID varchar(100),
    @Money varchar(100),
    @Index int,
    @Size int,
    @TotleCount int output
    as
    if(exists(select * from tempdb..sysobjects where id = OBJECT_ID('tempdb..#tt') ) )
    begin
    truncate table #tt
    end
    else
    begin
    create table #tt
    (
    tLen int
    )
    end
    declare @sql varchar(max)
    declare @sqllen varchar(max)
    set @sql='select ROW_NUMBER() over(order by main_time) as rowIndex ,* from main where 1=1 '
    if(ISNULL( @FeeID,'')!='')
    begin
    set @sql+= ' and main_feeId='+@FeeID
    end
    if(ISNULL( @Money,'')!='')
    begin
    set @sql+= ' and main_money='+@Money
    end
    declare @start int
    declare @end int
    set @start= (@Index-1)*@Size+1
    set @end=@Size*@Index
    set @sqllen=' insert into #tt select count(1) from ('+@sql+') t '
    --print(@sqllen)
    exec(@sqllen)
    select @TotleCount=tLen from #tt
    set @sql= 'select * from ( '+@sql+') t where rowIndex between '+ CONVERT(varchar(10), @start) +' and '+ CONVERT(varchar(10), @end)
    exec(@sql)

    改写后的结果

    if(exists(select * from sysobjects where id= OBJECT_ID('procTest') ))
    begin
    drop proc procTest
    end

    go
    create proc procTest
    @FeeID varchar(100),
    @Money varchar(100),
    @Index int,
    @Size int,
    @TotleCount int output
    as

    declare @sql varchar(max)
    declare @sqllen nvarchar(max)
    set @sql='select ROW_NUMBER() over(order by main_time) as rowIndex ,* from main where 1=1 '
    if(ISNULL( @FeeID,'')!='')
    begin
    set @sql+= ' and main_feeId='+@FeeID
    end
    if(ISNULL( @Money,'')!='')
    begin
    set @sql+= ' and main_money='+@Money
    end
    declare @start int
    declare @end int
    set @start= (@Index-1)*@Size+1
    set @end=@Size*@Index

    set @sqllen=' select @TotleCount= count(1) from ('+@sql+') t '
    exec sp_executesql @sqllen, N'@TotleCount int output',@TotleCount output

    set @sql= 'select * from ( '+@sql+') t where rowIndex between '+ CONVERT(varchar(10), @start) +' and '+ CONVERT(varchar(10), @end)
    exec(@sql)

    调用

    declare @aa int 
    exec procTest '7','',1,40, @aa output 
    select @aa

  • 相关阅读:
    LInux 解压缩文件
    关于启明星系统移除apppath配置,让系统自动获取路径来设置cookie的解决方法
    Repository 设计模式介绍
    启明星桌面天气系统和抽奖系统源代码
    关于web.config增加禁止匿名访问而导致pdf失效的问题
    C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher (WMI)
    如何在windows2008/2012上安装启明星系统。
    连接MSSQL2008 Express
    启明星系统加密方法代码
    MSSQL2008 全文索引的创建
  • 原文地址:https://www.cnblogs.com/Rock-Lee/p/6821472.html
Copyright © 2011-2022 走看看