• 最牛叉的分页存储过程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
    
    
  • 相关阅读:
    优化SQL Server数据库的经验总结
    #main和.main区别
    通过SQL把n条记录插入表中
    11月6日到8日参加微软Tech.ED2008大会
    NOIP2017 D2T1奶酪
    NOIP2017 D1T2时间复杂度
    NOIP2017 D2T2宝藏
    NOIP2017 D1T1小凯的疑惑
    NOIP2017 D1T3逛公园
    NOIP2017 D2T3列队
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1724022.html
Copyright © 2020-2023  润新知