• SQL Server 单表和多表联查的万能存储过程


    --单表万能存储过程
    create procedure Proc_SingleTablePager
    (
        @TableName varchar(50),             --表名
        @ReFieldsStr varchar(200) = '*',    --字段名(全部字段为'*')
        @OrderString varchar(200),          --排序字段(必须!支持多字段不用加order by)
        @WhereString varchar(500) = N'',    --条件语句(不用加where)
        @PageSize int,                      --每页多少条记录
        @PageIndex int = 1,                 --指定当前为第几页
        @TotalRecord int output             --返回总记录数
    )
    as
    begin
        --处理开始点和结束点
        declare @StartRecord int;
        declare @EndRecord int;
        declare @TotalCountSql nvarchar(500);
        declare @SqlString nvarchar(2000);
        set @StartRecord = (@PageIndex - 1) * @PageSize + 1 --起始记录
        set @EndRecord = @StartRecord + @PageSize - 1 --结尾记录
        set @TotalCountSql = N'select @TotalRecord = count(*) from ' + @TableName;--总记录数语句
        set @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句
        --
        if(@WhereString != '' or @WhereString != null)
            begin
                set @TotalCountSql = @TotalCountSql + ' where ' + @WhereString;
                set @SqlString = @SqlString+ ' where'+ @WhereString;
            end
        --第一次执行得到
        exec sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数
        --执行主语句
        SET @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' +  ltrim(str(@EndRecord));
        exec(@SqlString)
    end
    
    declare @total int
    exec Proc_SingleTablePager R_UserInfo,'*',UserID,' DepartmentID like ''CEF7F651-D4CD-4E6A-93CF-875401939AF8''',2,1,@total output
    select @total
    
    
    --多表万能存储过程
    create procedure Proc_MultipleTablesPager
    (
        @tblName varchar(255),             --表名(注意:可以多表连接)
        @strGetFields varchar(1000) = '*', --需要返回的列
        @OrderfldName varchar(255) = '',   --排序的字段名
        @PageSize int,                     --页尺寸
        @PageIndex int = 1,                --页码
        @doCount int = 1 output,           --查询到的记录数
        @OrderType bit = 0,                --设置排序类型,非0值则降序
        @strWhere varchar(500) = ''        --查询条件(注意:不要加where)
    )
    as
    begin
        declare @strSQL nvarchar(4000) --主语句
        declare @strTmp varchar(110) --临时变量
        declare @strOrder varchar(300) --排序类型
        if @strWhere != ''
            set @strSQL = 'select @doCount=count(*) from '+@tblName+' where '+@strWhere
        else
            set @strSQL = 'select @doCount=count(*) from '+@tblName
        exec sp_executesql @strSQL,N'@doCount int out',@doCount out
        --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。一下的所有代码都是@doCount为0的情况
        set @strSQL = '';
        if @OrderType != 0
        begin
            set @strTmp = '<(select min'
            --如果@OrderType不是0,就要执行降序,这句很重要
            set @strOrder = ' order by ['+@OrderfldName+'] desc'
        end
        else
        begin
            set @strTmp = '>(select max'
            set @strOrder = ' order by ['+@OrderfldName+'] asc'
        end
        if @PageIndex = 1
        begin
            if @strWhere != ''
                set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
            else
                --如果是第一页就执行上面的代码,这样会加快执行的速度
                set @strSQL = 'select top '+str(@PageSize)+' '+@strGetFields+' from '+@tblName+' '+@strOrder
        end
        else
        --一下代码赋予了@strSQL真正执行的sql代码
        begin
            set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
                          + @tblName + ' where [' + @OrderfldName + ']' + @strTmp + '
                          (['+ @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) 
                          + ' ['+ @OrderfldName + '] from ' + @tblName + ' ' + @strOrder + ') as tblTmp)'+ @strOrder 
            if @strWhere != ''
                set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
                              + @tblName + ' where [' + @OrderfldName + ']' + @strTmp + '(['
                              + @OrderfldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
                              + @OrderfldName + '] from ' + @tblName + ' where ' + @strWhere + ' '
                              + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
        end
        exec(@strSQL)
    end
  • 相关阅读:
    【Android Studio安装部署系列】二十四、Android studio中Gradle插件版本和Gradle版本关系
    【Android Studio安装部署系列】二十三、Android studio查看Gradle版本号
    linux查看文件前几行和后几行的命令
    iphone订阅服务在那里取消
    idea 默认全局配置maven,避免每次新建项目都需要指定自己的maven目录
    Java:session中的invalidate()的作用是什么呢?求解
    SESSION.INVALIDATE()
    Session中清除对象方法比较
    linux--Linux 各目录及每个目录的详细介绍
    Linux 下各个目录的作用及内容
  • 原文地址:https://www.cnblogs.com/lina0621/p/13958858.html
Copyright © 2020-2023  润新知