--通用的SQL Server 2005 分頁程序,由該存儲過程自動生成。
生成存儲過程注意:
- 該分頁存儲過程需要傳遞表名。
- 儘量爲該表建立主鍵。
@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
--使用生成的存儲過程注意:
- 儘量爲分頁傳遞排序條件
- 如果沒有爲分頁傳遞排序條件、系統自動去搜索表的主鍵,默認以表的主鍵升序爲分頁條件。由於搜索表的主鍵消耗資源比較大,所以效率很降低。