zoukankan      html  css  js  c++  java
  • 高效多表分页存储过程,可支持多表查询,任意排序

    废话不多说,直接上代码:

    SQL存储过程:

    CREATE PROCEDURE usp_PagingLarge
    @TableNames VARCHAR(200),     --表名,可以是多个表,但不能用别名
    @PrimaryKey VARCHAR(100),     --主键,可以为空,但@Order为空时该值不能为空
    @Fields     VARCHAR(4000),         --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
    @PageSize INT,             --每页记录数
    @CurrentPage INT,         --当前页,0表示第1页
    @Filter VARCHAR(4000) = '',     --条件,可以为空,不用填 where
    @Group VARCHAR(200) = '',     --分组依据,可以为空,不用填 group by
    @Order VARCHAR(200) = '',    --排序,可以为空,为空默认按主键升序排列,不用填 order by
    @RecordCount int OUTPUT             --总记录数,自己增加(总记录数)
    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 @TopRows
         --print @Operator
         EXEC('
             DECLARE @SortColumnBegin ' + @type + '
             SET ROWCOUNT ' + @TopRows + '
             Select @SortColumnBegin=' + @SortColumn + ' FROM   ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' orDER BY ' + @Order + '
             SET ROWCOUNT ' + @PageSize + '
             Select ' + @Fields + ' FROM   ' + @TableNames + ' ' + @Filter   + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' orDER BY ' + @Order + '    
         ')    
          IF @RecordCount IS NULL
    BEGIN
        DECLARE @sql nvarchar(4000)
        SET @sql=N'SELECT @RecordCount=COUNT(*)'
            +N' FROM '+@TableNames
            +N' '+@Filter
        EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT
    END
    
    
    END

    SQL调用:

    declare @count int
    exec usp_PagingLarge '表1,表2,表3','表1 主键','要添加的字段',10,1,'条件,多条件时用and连接','','排序字段 desc',@RecordCount=@count output
    select @count

    C#调用:

    List<usp_PagingLarge_Result> Me = he.usp_PagingLarge("表1,表2,表3", "表1 主键", "要添加的字段", 10, 1, "条件,多条件时用and连接", "", "排序字段 desc", count).ToList();
    Console.WriteLine(count.Value);
  • 相关阅读:
    洛谷 P2920 [USACO08NOV]时间管理Time Management
    湖南测试 1
    洛谷 P1824 进击的奶牛
    4、map 和 tuple
    -_-#【Better JS Code】插入迭代值
    -_-#【JS】defer / async
    -_-#【JS】HTML5 API
    【jQuery】jQuery API 过 一 遍
    ♫【函数】函数声明 / 函数表达式
    -_-#【Mac】命令
  • 原文地址:https://www.cnblogs.com/genesis/p/5589427.html
Copyright © 2011-2022 走看看