SQL Server 2005通用分頁代碼

--通用的SQL Server 2005 分頁程序,由該存儲過程自動生成。

生成存儲過程注意:

  • 該分頁存儲過程需要傳遞表名。
  • 儘量爲該表建立主鍵。

 

 

CREATE PROC #AutoGeneration_Query_P
@TABLENAME VARCHAR(50)
AS
BEGIN
 
DECLARE @HOST_NAME VARCHAR(200)
 
DECLARE @GET_DATE DATETIME
 
DECLARE @SQLROC  VARCHAR(8000)
 
DECLARE @DESCRIPTION VARCHAR(4000)
 
SELECT @SQLROC='',@DESCRIPTION='',
   
@HOST_NAME=HOST_NAME(),@GET_DATE=GETDATE()
 
SET @SQLROC=@SQLROC+'IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE ID=OBJECT_ID(''SP_'+@TABLENAME+'_Query'') AND XTYPE IN (N''P''))'+CHAR(10)
 
SET @SQLROC=@SQLROC+SPACE(5)+'DROP PROC SP_'+@TABLENAME+'_Query'+CHAR(10)
 
SET @SQLROC=@SQLROC+'GO '
 
SET @DESCRIPTION=@DESCRIPTION+'/*+--------------------------------------+'+CHAR(10)                        
 
SET @DESCRIPTION=@DESCRIPTION+'| 過程名稱:SP_'+@TABLENAME+'_Query'+CHAR(10)                        
 
SET @DESCRIPTION=@DESCRIPTION+'| 功能說明:根據條件獲取表'+@TABLENAME+'的記錄的分頁存儲過程'+CHAR(10)                        
 
SET @DESCRIPTION=@DESCRIPTION+'| 入口參數:@SearchCondition:搜索條件,    @OrderList:分頁排序方式'+CHAR(10)                    
 
SET @DESCRIPTION=@DESCRIPTION+'|            @PageSize:頁大小,            @PageIndex:當前頁'+CHAR(10
 
SET @DESCRIPTION=@DESCRIPTION+'| 過程返回:返回記錄數'+CHAR(10)                        
 
SET @DESCRIPTION=@DESCRIPTION+'| 維護記錄:Y/A'+CHAR(10)                        
 
SET @DESCRIPTION=@DESCRIPTION+'| 使用案例:SP_'+@TABLENAME+'_Query '''','''',20,10'+CHAR(10)                        
 
SET @DESCRIPTION=@DESCRIPTION+'| 工作站名:'+@HOST_NAME+''+CHAR(10)                        
 
SET @DESCRIPTION=@DESCRIPTION+'| 聯繫方式:[email protected]'+CHAR(10)                        
 
SET @DESCRIPTION=@DESCRIPTION+'| 創建日期:'+CONVERT(VARCHAR(20),@GET_DATE,120)+''+CHAR(10)                         
 
SET @DESCRIPTION=@DESCRIPTION+'+--------------------------------------+*/'+CHAR(10)                        
 
SELECT @SQLROC=@SQLROC+CHAR(10)+@DESCRIPTION+'CREATE PROC SP_'+@TABLENAME+'_Query'                        
 
SET @SQLROC=@SQLROC+CHAR(13)+CHAR(10)+SPACE(4)+'@SearchCondition'+SPACE(20-LEN('@SearchCondition'))+'VARCHAR(2000), --查詢條件'                        
 
SET @SQLROC=@SQLROC+CHAR(13)+CHAR(10)+SPACE(4)+'@OrderList'+SPACE(20-LEN('@OrderList'))+'VARCHAR(1000), --排序列表'                        
 
SET @SQLROC=@SQLROC+CHAR(13)+CHAR(10)+SPACE(4)+'@PageSize'+SPACE(20-LEN('@PageSize'))+'INT=10,           --每頁的大小'                
 
SET @SQLROC=@SQLROC+CHAR(13)+CHAR(10)+SPACE(4)+'@PageIndex'+SPACE(20-LEN('@PageIndex'))+'INT               --要顯示的頁碼'    
 
SET @SQLROC=@SQLROC+CHAR(10)+'AS'+CHAR(10)+'BEGIN'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'SET NOCOUNT ON'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'DECLARE @SQL VARCHAR(200)'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'DECLARE @KEYCOLUMNS VARCHAR(200)'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'DECLARE @DBNAME VARCHAR(20)'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'SELECT @SQL='''',@KEYCOLUMNS='''',@DBNAME=DB_NAME() '                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'IF ISNULL(@SearchCondition,'''')=''''  AND ISNULL(@OrderList,'''')<>'''''                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'BEGIN'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'SET @SQL=''SELECT * FROM (    '                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'                SELECT ROW_NUMBER()OVER(ORDER BY ''+@OrderList+'' ) AS ROWID,* FROM '+@TABLENAME+' '
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'            ) AS MYTABLE '     
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'    WHERE ROWID BETWEEN ''+LTRIM(@PageSize)+''*(''+LTRIM(@PageIndex)+''-1)+1 and ''+LTRIM(@PageSize)+''*''+LTRIM(@PageIndex)+'' '' '             
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'END'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'IF ISNULL(@SearchCondition,'''')=''''  AND ISNULL(@OrderList,'''')='''''                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'BEGIN'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' SELECT @KEYCOLUMNS=@KEYCOLUMNS+'',''+A.NAME'                                            
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' FROM SYSCOLUMNS A INNER JOIN  SYSTYPES B'                                            
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' ON A.XUSERTYPE=B.XUSERTYPE    AND ID=OBJECT_ID('''+@TABLENAME+''')'                                        
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' AND  EXISTS(SELECT 1 FROM SYSOBJECTS '                                            
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'                WHERE XTYPE=''PK'' AND PARENT_OBJ=A.ID AND NAME IN ('                            
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'                    SELECT NAME FROM SYSINDEXES '                        
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'                    WHERE INDID IN('                         
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'                    SELECT INDID FROM SYSINDEXKEYS '                         
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'                    WHERE ID = A.ID AND COLID=A.COLID'                         
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'                                )'             
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'                                            
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' )'                                             
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' SET @KEYCOLUMNS=STUFF(@KEYCOLUMNS,1,1,'''')'                                             
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' IF ISNULL(@KEYCOLUMNS,'''')=''''  '                                             
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' BEGIN'                                             
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'    raiserror(''SQL Server 2005 中需要提供排序字段,默認爲表的主鍵字段'',16,1,@DBNAME)'                                         
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'    RETURN '                 
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' END'                     
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' SET @SQL=''SELECT * FROM (    '                    
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'                SELECT ROW_NUMBER()OVER(ORDER BY ''+@KEYCOLUMNS+'' ) AS ROWID,* FROM '+@TABLENAME+' '    
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'            ) AS MYTABLE '         
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'    WHERE ROWID BETWEEN ''+LTRIM(@PageSize)+''*(''+LTRIM(@PageIndex)+''-1)+1 and ''+LTRIM(@PageSize)+''*''+LTRIM(@PageIndex)+''  '' '                 
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'END'                    
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'IF ISNULL(@SearchCondition,'''')<>''''  AND ISNULL(@OrderList,'''')='''''                    
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'BEGIN'                    
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' SELECT @KEYCOLUMNS=@KEYCOLUMNS+'',''+A.NAME'                    
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' FROM SYSCOLUMNS A INNER JOIN  SYSTYPES B'                    
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' ON A.XUSERTYPE=B.XUSERTYPE    AND ID=OBJECT_ID('''+@TABLENAME+''')'                
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
' AND  EXISTS(SELECT 1 FROM SYSOBJECTS '                    
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'                WHERE XTYPE=''PK'' AND PARENT_OBJ=A.ID AND NAME IN ('    
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'                    SELECT NAME FROM SYSINDEXES '
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'                    WHERE INDID IN(' 
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'                    SELECT INDID FROM SYSINDEXKEYS '                         
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'                    WHERE ID = A.ID AND COLID=A.COLID'                         
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'                                )'             
 SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+
'                                            
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' )'                                             
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' SET @KEYCOLUMNS=STUFF(@KEYCOLUMNS,1,1,'''')'                                             
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' IF ISNULL(@KEYCOLUMNS,'''')='''' '                                             
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' BEGIN'                                             
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'    raiserror(''SQL Server 2005 中需要提供排序字段,默認爲表的主鍵字段'',16,1,@DBNAME)'                                         
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'    RETURN '                                         
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' END'                                             
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+' SET @SQL=''SELECT * FROM (    '                                            
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'                SELECT ROW_NUMBER()OVER(ORDER BY ''+@KEYCOLUMNS+'' ) AS ROWID,* FROM '+@TABLENAME+' '                            
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'            ) AS MYTABLE '                                 
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'    WHERE ROWID BETWEEN ''+LTRIM(@PageSize)+''*(''+LTRIM(@PageIndex)+''-1)+1 and ''+LTRIM(@PageSize)+''*''+LTRIM(@PageIndex)+'' '                                         
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'    AND @SearchCondition '' '                                         
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'END'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'IF ISNULL(@SearchCondition,'''')<>''''  AND ISNULL(@OrderList,'''')<>'''' '                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'BEGIN'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'        SET @SQL=''SELECT * FROM (    '        
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'                SELECT ROW_NUMBER()OVER(ORDER BY ''+@OrderList+'' ) AS ROWID,* FROM '+@TABLENAME+' '
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'            ) AS MYTABLE '     
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'        WHERE ROWID BETWEEN ''+LTRIM(@PageSize)+''*(''+LTRIM(@PageIndex)+''-1)+1 and ''+LTRIM(@PageSize)+''*''+LTRIM(@PageIndex)+'' '         
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'        AND @SearchCondition '' '          
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'END'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(8)+'EXEC(@SQL)'                
 
SET @SQLROC=@SQLROC+CHAR(10)+SPACE(4)+'SET NOCOUNT OFF'                 
 
SET @SQLROC=@SQLROC+CHAR(10)+'END'                
 
PRINT @SQLROC+CHAR(10)+'GO '                
END                
GO                
                
CREATE PROC #SP_Generation_Query
@TABLENAMES VARCHAR(8000)
AS 
BEGIN
DECLARE @I INT
DECLARE @TABLENAME VARCHAR(100)
SET @I=CHARINDEX(',',@TABLENAMES)
WHILE @I>0
BEGIN
 
SET @TABLENAME=LEFT(@TABLENAMES,@I-1)
 
EXEC #AutoGeneration_Query_P @TABLENAME
 
SET @TABLENAMES=RIGHT(@TABLENAMES,LEN(@TABLENAMES)-@I)
 
SET @I=CHARINDEX(',',@TABLENAMES)
END
IF LEN(@TABLENAMES)>0
BEGIN
 
EXEC #AutoGeneration_Query_P @TABLENAMES
END
END
GO

#SP_Generation_Query 
'tb_human_plan2'

drop proc #SP_Generation_Query
drop proc #AutoGeneration_Query_P 


 

--使用生成的存儲過程注意:

  • 儘量爲分頁傳遞排序條件
  • 如果沒有爲分頁傳遞排序條件、系統自動去搜索表的主鍵,默認以表的主鍵升序爲分頁條件。由於搜索表的主鍵消耗資源比較大,所以效率很降低。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章