Copy Code code as follows:
DECLARE @TotalCount int
DECLARE @TotalPageCount int
exec p_viewpage_a ' type1 ', ' * ', ' id ', ', ' ID ASC ', 1,0,4,3, @TotalCount output, @TotalPageCount output
SELECT * FROM Type1
Create PROC p_viewpage_a
/*
Nzperfect [No_miss] Efficient common paging stored procedure (bidirectional retrieval) 2007.5.7 qq:34813284
Warning: Tables or views that apply to a single primary key or existence of a unique value column
Ps:sql statement is 8000 bytes, please note that the incoming parameter and the total SQL length do not exceed the specified range
*/
@TableName VARCHAR (200),--table name
@FieldList VARCHAR (2000),--Display column names, if all fields are *
@PrimaryKey VARCHAR (100),--single primary key or unique value key
@Where VARCHAR (2000),--the query condition does not contain a ' Where ' character, such as Id>10 and Len (userid) >9
@Order VARCHAR (1000),--sorting does not contain an ' order by ' character, such as ID Asc,userid desc, you must specify ASC or DESC
-Note that when the @sorttype=3 comes into effect, remember to add the primary key at the end, otherwise it will make you more depressed
@SortType INT,--collation 1: Positive order ASC 2: Reverse DESC 3: Multi-column Sorting method
@RecorderCount INT,--Total records 0: Returns the total record
@PageSize INT--number of records output per page
@PageIndex INT,--current page number
@TotalCount INT OUTPUT,--Returns the total record
@TotalPageCount INT OUTPUT--Total number of pages returned
As
SET NOCOUNT on
IF ISNULL (@TotalCount, ') = ' SET @TotalCount = 0
SET @Order = RTRIM (LTRIM (@Order))
SET @PrimaryKey = RTRIM (LTRIM (@PrimaryKey))
SET @FieldList = REPLACE (RTRIM (LTRIM (@FieldList)), ', '
While CHARINDEX (', ', @Order) > 0 OR CHARINDEX (', ', @Order) > 0
BEGIN
SET @Order = REPLACE (@Order, ', ', ', ', ')
SET @Order = REPLACE (@Order, ', ', ', ', ')
End
IF ISNULL (@TableName, ') = ' OR ISNULL (@FieldList, ') = '
or ISNULL (@PrimaryKey, ') = '
or @SortType < 1 or @SortType >3
or @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0
BEGIN
PRINT (' err_00 ')
Return
End
IF @SortType = 3
BEGIN
IF (UPPER (@Order, 4))!= ' ASC ' and UPPER (right (@Order, 5))!= ' DESC ')
BEGIN PRINT (' err_02 ') return end
End
DECLARE @new_where1 VARCHAR (1000)
DECLARE @new_where2 VARCHAR (1000)
DECLARE @new_order1 VARCHAR (1000)
DECLARE @new_order2 VARCHAR (1000)
DECLARE @new_order3 VARCHAR (1000)
DECLARE @Sql VARCHAR (8000)
DECLARE @SqlCount NVARCHAR (4000)
IF ISNULL (@where, ') = '
BEGIN
SET @new_where1 = '
SET @new_where2 = ' WHERE '
End
ELSE
BEGIN
SET @new_where1 = ' WHERE ' + @where
SET @new_where2 = ' WHERE ' + @where + ' and '
End
IF ISNULL (@order, ') = ' or @SortType = 1 or @SortType = 2
BEGIN
IF @SortType = 1
BEGIN
SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' ASC '
SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' DESC '
End
IF @SortType = 2
BEGIN
SET @new_order1 = ' ORDER BY ' + @PrimaryKey + ' DESC '
SET @new_order2 = ' ORDER BY ' + @PrimaryKey + ' ASC '
End
End
ELSE
BEGIN
SET @new_order1 = ' ORDER BY ' + @Order
End
IF @SortType = 3 and CHARINDEX (', ' + @PrimaryKey + ', ', ' + @Order) >0
BEGIN
SET @new_order1 = ' ORDER BY ' + @Order
SET @new_order2 = @Order + ', '
SET @new_order2 = replace (replace (@new_order2, ' ASC, ', ' {ASC}, '), ' DESC, ', ' {DESC}, ')
SET @new_order2 = replace (replace (@new_order2, ' {ASC}, ', ' DESC, '), ' {DESC}, ', ' ASC, ')
SET @new_order2 = ' ORDER BY ' + SUBSTRING (@new_order2, 1,len (@new_order2)-1)
IF @FieldList <> ' * '
BEGIN
SET @new_order3 = replace (replace (@Order + ', ', ' ASC, ', ', '), ' DESC, ', ', ')
SET @FieldList = ', ' + @FieldList
While CHARINDEX (', ', @new_order3) >0
BEGIN
IF CHARINDEX (SUBSTRING (', ' + @new_order3, 1,charindex (', ', @new_order3)), ', ' + @FieldList + ', ') >0
BEGIN
SET @FieldList =
@FieldList + ', ' + SUBSTRING (@new_order3, 1,charindex (', ', @new_order3))
End
SET @new_order3 =
SUBSTRING (@new_order3, CHARINDEX (', ', @new_order3) +1,len (@new_order3))
End
SET @FieldList = SUBSTRING (@FieldList, 2,len (@FieldList))
End
End
SET @SqlCount = ' SELECT @TotalCount =count (*), @TotalPageCount =ceiling ((COUNT (*) +0.0)/'
+ CAST (@PageSize as VARCHAR) + ') from ' + @TableName + @new_where1
IF @RecorderCount = 0
BEGIN
EXEC sp_executesql @SqlCount, N ' @TotalCount int output, @TotalPageCount int output ',
@TotalCount output, @TotalPageCount output
End
ELSE
BEGIN
SELECT @TotalCount = @RecorderCount
End
IF @PageIndex > CEILING ((@TotalCount +0.0)/@PageSize)
BEGIN
SET @PageIndex = CEILING ((@TotalCount +0.0)/@PageSize)
End
IF @PageIndex = 1 OR @PageIndex >= CEILING ((@TotalCount +0.0)/@PageSize)
BEGIN
IF @PageIndex = 1--Returns the first page of data
BEGIN
SET @Sql = ' SELECT top ' + STR (@PageSize) + "+ @FieldList + ' from '
+ @TableName + @new_where1 + @new_order1
End
IF @PageIndex >= CEILING ((@TotalCount +0.0)/@PageSize)--Returns the last page of data
BEGIN
SET @Sql = ' SELECT top ' + STR (@PageSize) + ' + @FieldList + ' from ('
+ ' SELECT top ' + STR (ABS (@PageSize * @PageIndex-@TotalCount-@PageSize))
+ ' + @FieldList + ' from '
+ @TableName + @new_where1 + @new_order2 + ') as TMP '
+ @new_order1
End
End
ELSE
BEGIN
IF @SortType = 1-only primary key positive order ordering
BEGIN
IF @PageIndex <= CEILING ((@TotalCount +0.0)/@PageSize)/2--forward retrieval
BEGIN
SET @Sql = ' SELECT top ' + STR (@PageSize) + "+ @FieldList + ' from '
+ @TableName + @new_where2 + @PrimaryKey + ' > '
+ ' (select MAX (' + @PrimaryKey + ') from (select top)
+ STR (@PageSize * (@PageIndex-1)) + ' + @PrimaryKey
+ ' from ' + @TableName
+ @new_where1 + @new_order1 + ') as TMP ' + @new_order1
End
ELSE--Reverse retrieval
BEGIN
SET @Sql = ' SELECT top ' + STR (@PageSize) + ' + @FieldList + ' from ('
+ ' SELECT top ' + STR (@PageSize) + '
+ @FieldList + ' from '
+ @TableName + @new_where2 + @PrimaryKey + ' < '
+ ' (select MIN (' + @PrimaryKey + ') from (select top)
+ STR (@TotalCount-@PageSize * @PageIndex) + ' + @PrimaryKey
+ ' from ' + @TableName
+ @new_where1 + @new_order2 + ') as TMP ' + @new_order2
+ ') as TMP ' + @new_order1
End
End
IF @SortType = 2-primary key reverse ordering only
BEGIN
IF @PageIndex <= CEILING ((@TotalCount +0.0)/@PageSize)/2--forward retrieval
BEGIN
SET @Sql = ' SELECT top ' + STR (@PageSize) + "+ @FieldList + ' from '
+ @TableName + @new_where2 + @PrimaryKey + ' < '
+ ' (select MIN (' + @PrimaryKey + ') from (select top)
+ STR (@PageSize * (@PageIndex-1)) + ' + @PrimaryKey
+ ' from ' + @TableName
+ @new_where1 + @new_order1 + ') as TMP ' + @new_order1
End
ELSE--Reverse retrieval
BEGIN
SET @Sql = ' SELECT top ' + STR (@PageSize) + ' + @FieldList + ' from ('
+ ' SELECT top ' + STR (@PageSize) + '
+ @FieldList + ' from '
+ @TableName + @new_where2 + @PrimaryKey + ' > '
+ ' (select MAX (' + @PrimaryKey + ') from (select top)
+ STR (@TotalCount-@PageSize * @PageIndex) + ' + @PrimaryKey
+ ' from ' + @TableName
+ @new_where1 + @new_order2 + ') as TMP ' + @new_order2
+ ') as TMP ' + @new_order1
End
End
If @SortType = 3-Multiple column sort, must contain the primary key, and the last place is not processed
BEGIN
IF CHARINDEX (', ' + @PrimaryKey + ', ', ' + @Order) = 0
BEGIN PRINT (' err_02 ') return end
IF @PageIndex <= CEILING ((@TotalCount +0.0)/@PageSize)/2--forward retrieval
BEGIN
SET @Sql = ' SELECT top ' + STR (@PageSize) + ' + @FieldList + ' from ('
+ ' SELECT top ' + STR (@PageSize) + ' + @FieldList + ' from ('
+ ' SELECT top ' + STR (@PageSize * @PageIndex) + ' + @FieldList
+ ' from ' + @TableName + @new_where1 + @new_order1 + ') as TMP '
+ @new_order2 + ') as TMP ' + @new_order1
End
ELSE--Reverse retrieval
BEGIN
SET @Sql = ' SELECT top ' + STR (@PageSize) + ' + @FieldList + ' from ('
+ ' SELECT top ' + STR (@PageSize) + ' + @FieldList + ' from ('
+ ' SELECT top ' + STR (@TotalCount-@PageSize * @PageIndex + @PageSize) + ' + @FieldList
+ ' from ' + @TableName + @new_where1 + @new_order2 + ') as TMP '
+ @new_order1 + ') as TMP ' + @new_order1
End
End
End
EXEC (@Sql)
Go
How to invoke the above stored procedure with vc#
current 1/2 page
1 2 Next read the full text