存储过程 为 SQL Server 2000版本,请打开SQL server 2000 的查询分析器执行下面的SQL 语句。 程序用到的存储过程(仅支持主键排序)
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[sys_QuickSortPaging]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[sys_QuickSortPaging] GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO CREATEPROCEDURE sys_QuickSortPaging ( @Tablenvarchar(4000), --表名(必须) @PrimaryKeyFieldnvarchar(50), --表的主键字段 @Fieldnvarchar (4000)='*', --需要返回字段名(必须) @Wherenvarchar(1000)=NULL, --Where 条件(可选) @GroupBynvarchar(1000) =NULL, --分组 @OrderBynvarchar(1000)=NULL, --排序用到的字段() @PageNumberint=1, --要返回的页(第X页) (默认为第一页) @PageSizeint=10, --每页大小(默认为5) @RecordCountint output --返回记录总数 ) AS SET NOCOUNT ON DECLARE@SortTablenvarchar(100) DECLARE@SortNamenvarchar(100) DECLARE@strSortColumnnvarchar(200) DECLARE@Operatornvarchar(50) DECLARE@Typevarchar(100) DECLARE@Precint IF@OrderByISNULLOR@OrderBy='' SET@OrderBy=@PrimaryKeyField /**//* 获取用于定位的字段*/ IFCHARINDEX('DESC',@OrderBy)>0 BEGIN SET@strSortColumn=REPLACE(@OrderBy, 'DESC', '') SET@Operator='<=' END ELSE BEGIN IFCHARINDEX('ASC', @OrderBy) =0 SET@strSortColumn=REPLACE(@OrderBy, 'ASC', '') SET@Operator='>=' END IFCHARINDEX('.', @strSortColumn) >0 BEGIN SET@SortTable=SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn)) SET@SortName=SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) +1, LEN(@strSortColumn)) END ELSE BEGIN SET@SortTable=@Table SET@SortName=@strSortColumn END 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 =@SortTableAND c.name =@SortName IFCHARINDEX('char', @Type) >0 SET@Type=@Type+'('+CAST(@PrecASnvarchar) +')' DECLARE@strStartRownvarchar(50) DECLARE@strPageSizenvarchar(50) DECLARE@strWherenvarchar(1000) DECLARE@strWhereAndnvarchar(1000) DECLARE@strGroupBynvarchar(1000) IF@PageNumber<1 SET@PageNumber=1 SET@strPageSize=CONVERT (nvarchar(50), @PageSize) SET@strStartRow=CONVERT ( nvarchar(50), (@PageNumber-1)*@PageSize+1) IF@WhereISNOTNULLAND@Where!='' BEGIN SET@strWhere=' WHERE '+@Where SET@strWhereAnd=' AND '+@Where END ELSE BEGIN SET@strWhere='' SET@strWhereAnd='' END IF@GroupByISNOTNULLAND@GroupBy!='' BEGIN SET@strGroupBy=' GROUP BY '+@GroupBy END ELSE BEGIN SET@strGroupBy='' END DECLARE@strSQLnvarchar(4000) SET@strSql=' SELECT @RecordCount = Count (*) FROM '+@Table+@strWhere+''+@strGroupBy EXEC sp_executesql @strSql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT--计算总页数 EXEC ( ' DECLARE @Sort '+@Type+' SET ROWCOUNT '+@strStartRow+' SELECT @Sort = '+@strSortColumn+' FROM '+@Table+@strWhere+''+@strGroupBy+' ORDER BY '+@OrderBy+' SET ROWCOUNT '+@strPageSize+' SELECT '+@Field+' FROM '+@Table+' WHERE '+@strSortColumn+@Operator+' @Sort '+@strWhereAnd+''+@strGroupBy+' ORDER BY '+@OrderBy ) GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
支持任意字段排序的存储过程
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[sys_SortDataPager]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[sys_SortDataPager] GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATEPROCEDURE sys_SortDataPager ( @Tablenvarchar(4000), --表名(必须) @PrimaryKeyFieldnvarchar(50), --表的主键字段 @Fieldnvarchar (4000)='*', --需要返回字段名(必须) @Wherenvarchar(1000)=NULL, --Where 条件(可选) @GroupBynvarchar(1000) =NULL, --分组 @OrderBynvarchar(1000)=NULL, --排序用到的字段() @PageNumberint=1, --要返回的页(第X页) (默认为第一页) @PageSizeint=10, --每页大小(默认为5) @RecordCountint out --返回记录总数 ) AS /**//*Find the @PrimaryKeyField type*/ DECLARE@PKTablevarchar(1000) DECLARE@PKNamevarchar(1000) DECLARE@typevarchar(1000) DECLARE@precint IFCHARINDEX('.', @PrimaryKeyField) >0 BEGIN SET@PKTable=SUBSTRING(@PrimaryKeyField, 0, CHARINDEX('.',@PrimaryKeyField)) SET@PKName=SUBSTRING(@PrimaryKeyField, CHARINDEX('.',@PrimaryKeyField) +1, LEN(@PrimaryKeyField)) END ELSE BEGIN SET@PKTable=@Table SET@PKName=@PrimaryKeyField END 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 =@PKTableAND c.name =@PKName IFCHARINDEX('char', @type) >0 SET@type=@type+'('+CAST(@precASvarchar) +')' DECLARE@strPageSizevarchar(50) DECLARE@strStartRowvarchar(50) DECLARE@strWherevarchar(1000) DECLARE@strGroupByvarchar(1000) /**//*Default Sorting*/ IF@OrderByISNULLOR@OrderBy='' SET@OrderBy=@PrimaryKeyField /**//*Default Page Number*/ IF@PageNumber<1 SET@PageNumber=1 /**//*Set paging variables.*/ SET@strPageSize=CAST(@PageSizeASvarchar(50)) SET@strStartRow=CAST(((@PageNumber-1)*@PageSize+1) ASvarchar(50)) /**//*Set filter & group variables.*/ IF@WhereISNOTNULLAND@Where!='' SET@strWhere=' WHERE '+@Where+'' ELSE SET@strWhere='' IF@GroupByISNOTNULLAND@GroupBy!='' SET@strGroupBy=' GROUP BY '+@GroupBy+'' ELSE SET@strGroupBy='' /**//*Execute dynamic query*/ DECLARE@strSQLnvarchar(4000) SET@strSql=' SELECT @RecordCount = Count (*) FROM '+@Table+@strWhere+''+@strGroupBy EXEC sp_executesql @strSql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT--计算总页数 EXEC( 'DECLARE @PageSize int SET @PageSize = '+@strPageSize+' DECLARE @PrimaryKeyField '+@type+' DECLARE @tblPK TABLE ( PK '+@type+' NOT NULL PRIMARY KEY ) DECLARE PagingCursor CURSOR DYNAMIC READ_ONLY FOR SELECT '+@PrimaryKeyField+' FROM '+@Table+@strWhere+''+@strGroupBy+' ORDER BY '+@OrderBy+' OPEN PagingCursor FETCH RELATIVE '+@strStartRow+' FROM PagingCursor INTO @PrimaryKeyField SET NOCOUNT ON WHILE @PageSize > 0 AND @@FETCH_STATUS = 0 BEGIN INSERT @tblPK (PK) VALUES (@PrimaryKeyField) FETCH NEXT FROM PagingCursor INTO @PrimaryKeyField SET @PageSize = @PageSize - 1 END CLOSE PagingCursor DEALLOCATE PagingCursor SELECT '+@Field+' FROM '+@Table+' JOIN @tblPK tblPK ON '+@PrimaryKeyField+' = tblPK.PK '+@strWhere+''+@strGroupBy+' ORDER BY '+@OrderBy ) GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[InsertTableData]') andOBJECTPROPERTY(id, N'IsProcedure') =1) dropprocedure[dbo].[InsertTableData] GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS OFF GO CREATEPROCEDURE InsertTableData AS DECLARE@cntbigint SET@cnt=0 WHILE@cnt<1000000 BEGIN INSERTINTO Employees(LastName,FirstName,BirthDate,Address,City,HomePhone,Extension) Values ( CAST('LastName '+CONVERT(nvarchar(10), @cnt) asnvarchar(30)), CAST('FirstName '+CONVERT(nvarchar(10), @cnt) asnvarchar(30)), GETDATE(), CAST('Address IS No.'+CONVERT(nvarchar(10), @cnt) asnvarchar(30)), CAST('City '+CONVERT(nvarchar(10), @cnt) asnvarchar(30)), CAST('021-0000'+LEFT(CONVERT(nvarchar(10), @cnt),4) asnvarchar(30)), CAST('00'+LEFT(CONVERT(nvarchar(10), @cnt) ,1) asnvarchar(30)) ) SET@cnt=@cnt+1 END GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO