• sql server2000 paged store procedure


    sql server 2000 paged store procedure ,we still used in project:

    代码
    /****** Object: StoredProcedure [dbo].[page] Script Date: 09/28/2010 18:38:39 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE Procedure [dbo].[page]
    /* Param List */
    @TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名
    @PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空
    @Fields VARCHAR(200), --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
    @PageSize INT, --每页记录数
    @CurrentPage INT, --当前页,0表示第1页
    @Filter VARCHAR(2800) = '', --条件,可以为空,不用填 where
    @Group VARCHAR(200) = '', --分组依据,可以为空,不用填 group by
    @Order VARCHAR(200) = '' , --排序,可以为空,为空默认按主键升序排列,不用填 order by
    @totalCount bigint output
    AS
    BEGIN

    DECLARE @getCountScript nvarchar(4000)
    DECLARE @totalRows bigint
    IF @Filter = ''
    SET @Filter = ' WHERE 1=1 '
    ELSE
    SET @Filter = ' WHERE ' + @Filter

    Set @getCountScript = 'select @totalRows = count(1) from ' + @TableNames + @Filter
    Execute sp_executesql @getCountScript, N'@totalRows int output', @totalCount output;

    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 + '
    ')
    END

    GO

  • 相关阅读:
    poj 2778 AC自己主动机 + 矩阵高速幂
    Web Services 指南之:Web Services 综述
    SQL多表连接查询(具体实例)
    HibernateUtil
    哈夫曼编码问题再续(下篇)——优先队列求解
    MySQL Merge存储引擎
    程序的入口及AppDelegate窗体显示原理
    几个免费的DNS地址
    kettle与各数据库建立链接的链接字符串
    【转】利用optimize、存储过程和系统表对mysql数据库表进行批量碎片清理释放表空间
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/1837814.html
Copyright © 2020-2023  润新知