zoukankan      html  css  js  c++  java
  • 最牛叉的分页存储过程2

    分页存储过程2
    SET QUOTED_IDENTIFIER ON 
    GO 
    SET ANSI_NULLS ON 
    GO 
    ALTER PROCEDURE usp_PagingLarge 
    @TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名
    @PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空
    @Fields VARCHAR(200), --要取出的字段,可以是多个表的字段,可以为空,为空表
    
    示select * 
    @PageSize INT, --每页记录数
    @CurrentPage INT, --当前页,表示第页
    @Filter VARCHAR(200) = '', --条件,可以为空,不用填where 
    @Group VARCHAR(200) = '', --分组依据,可以为空,不用填group by 
    @Order VARCHAR(200) = '' --排序,可以为空,为空默认按主键升序排列,不用填
    
    order by 
    AS 
    BEGIN 
    DECLARE @SortColumn VARCHAR(200) 
    DECLARE @Operator CHAR(2) 
    DECLARE @SortTable VARCHAR(200) 
    DECLARE @SortName VARCHAR(200) 
    IF @Fields = '' 
    SET @Fields = '*' 
    IF @Filter = '' 
    SET @Filter = 'WHERE 1=1' 
    ELSE 
    SET @Filter = 'WHERE ' + @Filter 
    IF @Group <>'' 
    SET @Group = 'GROUP BY ' + @Group 
    IF @Order <> '' 
    BEGIN 
    DECLARE @pos1 INT, @pos2 INT 
    SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC') 
    IF CHARINDEX(' DESC', @Order) > 0 
    IF CHARINDEX(' ASC', @Order) > 0 
    BEGIN 
    IF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order) 
    SET @Operator = '<=' 
    ELSE 
    SET @Operator = '>=' 
    END 
    ELSE 
    SET @Operator = '<=' 
    ELSE 
    SET @Operator = '>=' 
    SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC',
    
    ''), ' ', '') 
    SET @pos1 = CHARINDEX(',', @SortColumn) 
    IF @pos1 > 0 
    SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1) 
    SET @pos2 = CHARINDEX('.', @SortColumn) 
    IF @pos2 > 0 
    BEGIN 
    SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1) 
    IF @pos1 > 0 
    SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1) 
    ELSE 
    SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2) 
    END 
    ELSE 
    BEGIN 
    SET @SortTable = @TableNames 
    SET @SortName = @SortColumn 
    END 
    END 
    ELSE 
    BEGIN 
    SET @SortColumn = @PrimaryKey 
    SET @SortTable = @TableNames 
    SET @SortName = @SortColumn 
    SET @Order = @SortColumn 
    SET @Operator = '>=' 
    END
    
    DECLARE @type varchar(50) 
    DECLARE @prec int 
    SELECT @type=t.name, @prec=c.prec 
    FROM sysobjects o 
    JOIN syscolumns c on o.id=c.id 
    JOIN systypes t on c.xusertype=t.xusertype 
    WHERE o.name = @SortTable AND c.name = @SortName
    
    
    IF CHARINDEX('char', @type) > 0 
    SET @type = @type + '(' + CAST(@prec AS varchar) + ')'
    
    DECLARE @TopRows INT 
    SET @TopRows = @PageSize * @CurrentPage + 1 
    PRINT @type 
    DECLARE @sql NVARCHAR(4000) 
    SET @Sql = 'DECLARE @SortColumnBegin ' + @type + ' 
    SET ROWCOUNT ' + Cast(@TopRows as VARCHAR(10))+ ' SELECT
    
    @SortColumnBegin=' + 
    @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + '
    
    ORDER BY ' + @Order + ' 
    SET ROWCOUNT ' + CAST(@PageSize AS VARCHAR(10)) + ' 
    SELECT ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' +
    
    @SortColumn + '' + @Operator + '@SortColumnBegin ' + ISNULL(@Group,'') + '
    
    ORDER BY ' + @Order + '' 
    -- Print(@sql) 
    Exec(@sql)
    
    END 
    GO 
    SET QUOTED_IDENTIFIER OFF 
    GO 
    SET ANSI_NULLS ON 
    GO
    
    
  • 相关阅读:
    php在没用xdebug等调试工具的情况下如何让调试内容优雅地展现出来?--php数组格式化
    linux自动定时备份web程序和mysql数据库
    linux下用cronolog分割apache日志
    写在前面--点燃酱爆心中的那团火
    我对知乎前端相关问题的十问十答(转)
    参考美团、饿了么 && localStorage
    vue-scroller的使用 && 开发自己的 scroll 插件
    如何发布一个包到npm && 如何使用自己发布的npm包 && 如何更新发布到npm的package && 如何更新当前项目的包?
    VUE中toast的使用与开发
    如何在vue && webpack 项目中的单文件组件中引入css
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1724022.html
Copyright © 2011-2022 走看看