if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetPaginationDataByKey]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[GetPaginationDataByKey]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO
/*
通用分页查询存储过程(按唯一键分页)
用法:
exec GetPaginationDataByKey @nvcharTable,@nvcharKeyField,@nvcharWhere,@nvcharSort,
@bitNoPage,@intPageSize,@intPageNo,@bitReturnAllOnFail,@intTotalCount output
DECLARE @intTotalCountReturn int
exec GetPaginationDataByKey 'ForumTopic','ID','',' ReplyCount DESC',
0,5,2,0,@intTotalCount = @intTotalCountReturn output
PRINT @intTotalCountReturn
*/
CREATE PROCEDURE dbo.GetPaginationDataByKey
(
@nvcharTable nvarchar(500), --要查询的表名或视图名称
@nvcharKeyField nvarchar(200), --表或视图中唯一标识记录的字段名称
@nvcharWhere nvarchar(2000), --Where子句
@nvcharSort nvarchar(2000), --ORDER BY子句
@bitNoPage bit, --是否需要分页返回 0:是 1:否
@intPageSize int, --每页数量
@intPageNo int, --当前页码
@bitReturnAllOnFail bit, --当参数不合法时,是否所有数据 1:是 0:否
@intTotalCount int output --所有符合条件的记录数量
)
AS
SET XACT_ABORT ON
SET NOCOUNT ON
--修订表名
DECLARE @nvcharTableNew nvarchar(500)
IF( @nvcharTable <> '')
BEGIN
SET @nvcharTableNew = ' [' + @nvcharTable + ']'
END
ELSE
BEGIN
SET @nvcharTableNew = ''
END
--修订Where语句
DECLARE @nvcharWhereNew nvarchar(2000)
IF(@nvcharWhere<> '')
SET @nvcharWhereNew = ' WHERE ( ' + @nvcharWhere + ' ) '
ELSE
SET @nvcharWhereNew = ' WHERE 1 = 1 '
--修订排序语句
DECLARE @nvcharSortNew nvarchar(2000)
IF(@nvcharSort <> '')
BEGIN
SET @nvcharSortNew = ' ORDER BY ' + @nvcharSort
END
ELSE
BEGIN
SET @nvcharSortNew = ''
END
--修订关键字段
DECLARE @nvcharKeyFieldNew nvarchar(200)
IF(@nvcharKeyField <> '')
BEGIN
SET @nvcharKeyFieldNew = '[' + @nvcharKeyField + ']'
END
ELSE
BEGIN
SET @nvcharKeyFieldNew = ''
END
--记录总数
DECLARE @QueryCountString NVARCHAR(4000)
SET @QueryCountString = 'SELECT @intTotal = COUNT(*) FROM ' + @nvcharTableNew + @nvcharWhereNew
execute sp_executesql @QueryCountString,
N'@nvcharTableNew nvarchar(2000), @nvcharWhereNew nvarchar(2000),@intTotal int output',
@nvcharTableNew, @nvcharWhereNew,@intTotalCount output
--如果不分页时返回所有
IF(@bitNoPage = 1)
BEGIN
EXEC('SELECT * FROM ' + @nvcharTableNew + @nvcharWhereNew + @nvcharSortNew)
RETURN
END
--参数不合法按要求返回空数据集或所有数据
IF(@intPageSize <= 0 OR @intPageNo < 1 OR @nvcharSortNew = '' OR @nvcharKeyFieldNew = '')
BEGIN
IF(@bitReturnAllOnFail = 0)
BEGIN
EXEC('SELECT Top 0 * FROM ' + @nvcharTableNew)
END
ELSE
BEGIN
EXEC('SELECT * FROM ' + @nvcharTableNew + @nvcharWhereNew + @nvcharSortNew)
END
RETURN
END
--查询语句
DECLARE @nvcharSql nvarchar(4000)
SET @nvcharSql =
' SELECT Top ' + CONVERT(nvarchar(200),@intPageSize) + ' * FROM ' + @nvcharTableNew + @nvcharWhereNew
+ ' AND '
+ @nvcharKeyFieldNew + ' NOT IN ('
+ ' SELECT Top ' + CONVERT(nvarchar(200),@intPageSize * (@intPageNo - 1)) + ' ' + @nvcharKeyFieldNew + ' FROM ' + @nvcharTableNew + @nvcharWhereNew + @nvcharSortNew
+ ' ) '
+ @nvcharSortNew
execute sp_executesql @nvcharSql,
N'@intPageSize int,@nvcharTableNew nvarchar(500),@nvcharWhereNew nvarchar(2000), @nvcharKeyFieldNew nvarchar(200),@intPageNo int,@nvcharSortNew nvarchar(2000)',
@intPageSize,@nvcharTableNew,@nvcharWhereNew,@nvcharKeyFieldNew,@intPageNo,@nvcharSortNew
SET NOCOUNT OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
drop procedure [dbo].[GetPaginationDataByKey]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO
/*
通用分页查询存储过程(按唯一键分页)
用法:
exec GetPaginationDataByKey @nvcharTable,@nvcharKeyField,@nvcharWhere,@nvcharSort,
@bitNoPage,@intPageSize,@intPageNo,@bitReturnAllOnFail,@intTotalCount output
DECLARE @intTotalCountReturn int
exec GetPaginationDataByKey 'ForumTopic','ID','',' ReplyCount DESC',
0,5,2,0,@intTotalCount = @intTotalCountReturn output
PRINT @intTotalCountReturn
*/
CREATE PROCEDURE dbo.GetPaginationDataByKey
(
@nvcharTable nvarchar(500), --要查询的表名或视图名称
@nvcharKeyField nvarchar(200), --表或视图中唯一标识记录的字段名称
@nvcharWhere nvarchar(2000), --Where子句
@nvcharSort nvarchar(2000), --ORDER BY子句
@bitNoPage bit, --是否需要分页返回 0:是 1:否
@intPageSize int, --每页数量
@intPageNo int, --当前页码
@bitReturnAllOnFail bit, --当参数不合法时,是否所有数据 1:是 0:否
@intTotalCount int output --所有符合条件的记录数量
)
AS
SET XACT_ABORT ON
SET NOCOUNT ON
--修订表名
DECLARE @nvcharTableNew nvarchar(500)
IF( @nvcharTable <> '')
BEGIN
SET @nvcharTableNew = ' [' + @nvcharTable + ']'
END
ELSE
BEGIN
SET @nvcharTableNew = ''
END
--修订Where语句
DECLARE @nvcharWhereNew nvarchar(2000)
IF(@nvcharWhere<> '')
SET @nvcharWhereNew = ' WHERE ( ' + @nvcharWhere + ' ) '
ELSE
SET @nvcharWhereNew = ' WHERE 1 = 1 '
--修订排序语句
DECLARE @nvcharSortNew nvarchar(2000)
IF(@nvcharSort <> '')
BEGIN
SET @nvcharSortNew = ' ORDER BY ' + @nvcharSort
END
ELSE
BEGIN
SET @nvcharSortNew = ''
END
--修订关键字段
DECLARE @nvcharKeyFieldNew nvarchar(200)
IF(@nvcharKeyField <> '')
BEGIN
SET @nvcharKeyFieldNew = '[' + @nvcharKeyField + ']'
END
ELSE
BEGIN
SET @nvcharKeyFieldNew = ''
END
--记录总数
DECLARE @QueryCountString NVARCHAR(4000)
SET @QueryCountString = 'SELECT @intTotal = COUNT(*) FROM ' + @nvcharTableNew + @nvcharWhereNew
execute sp_executesql @QueryCountString,
N'@nvcharTableNew nvarchar(2000), @nvcharWhereNew nvarchar(2000),@intTotal int output',
@nvcharTableNew, @nvcharWhereNew,@intTotalCount output
--如果不分页时返回所有
IF(@bitNoPage = 1)
BEGIN
EXEC('SELECT * FROM ' + @nvcharTableNew + @nvcharWhereNew + @nvcharSortNew)
RETURN
END
--参数不合法按要求返回空数据集或所有数据
IF(@intPageSize <= 0 OR @intPageNo < 1 OR @nvcharSortNew = '' OR @nvcharKeyFieldNew = '')
BEGIN
IF(@bitReturnAllOnFail = 0)
BEGIN
EXEC('SELECT Top 0 * FROM ' + @nvcharTableNew)
END
ELSE
BEGIN
EXEC('SELECT * FROM ' + @nvcharTableNew + @nvcharWhereNew + @nvcharSortNew)
END
RETURN
END
--查询语句
DECLARE @nvcharSql nvarchar(4000)
SET @nvcharSql =
' SELECT Top ' + CONVERT(nvarchar(200),@intPageSize) + ' * FROM ' + @nvcharTableNew + @nvcharWhereNew
+ ' AND '
+ @nvcharKeyFieldNew + ' NOT IN ('
+ ' SELECT Top ' + CONVERT(nvarchar(200),@intPageSize * (@intPageNo - 1)) + ' ' + @nvcharKeyFieldNew + ' FROM ' + @nvcharTableNew + @nvcharWhereNew + @nvcharSortNew
+ ' ) '
+ @nvcharSortNew
execute sp_executesql @nvcharSql,
N'@intPageSize int,@nvcharTableNew nvarchar(500),@nvcharWhereNew nvarchar(2000), @nvcharKeyFieldNew nvarchar(200),@intPageNo int,@nvcharSortNew nvarchar(2000)',
@intPageSize,@nvcharTableNew,@nvcharWhereNew,@nvcharKeyFieldNew,@intPageNo,@nvcharSortNew
SET NOCOUNT OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
--SQL 2005
WITH TempQuery AS
(
SELECT {0}, ROW_NUMBER() OVER (ORDER BY {3}) AS 'RowNumberForSplit'
FROM {1}
WHERE 1 = 1 {2}
)
SELECT *
FROM TempQuery
WHERE RowNumberForSplit BETWEEN {4} AND {5};
WITH TempQuery AS
(
SELECT {0}, ROW_NUMBER() OVER (ORDER BY {3}) AS 'RowNumberForSplit'
FROM {1}
WHERE 1 = 1 {2}
)
SELECT *
FROM TempQuery
WHERE RowNumberForSplit BETWEEN {4} AND {5};