(收藏研究)
IF OBJECT_ID(N'dbo.p_show') IS NOT NULL
DROP PROCEDURE dbo.p_show
GO
/**//*--实现分页的通用存储过程
显示指定表、视图、查询结果的第X页
对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
如果视图或查询结果中有主键,不推荐此方法
如果使用查询语句,而且查询语句使用了order by,则查询语句必须包含top 语句
最后更新时间: 2008.01.20
--邹建 2003.09(引用请保留此信息)--*/
/**//*--调用示例
EXEC dbo.p_show
@QueryStr = N'tb',
@PageSize = 5,
@PageCurrent = 3,
@FdShow = 'id, colid, name',
@FdOrder = 'colid, name'
select id, colid from tb
order by colid, name
EXEC dbo.p_show
@QueryStr = N'
SELECT TOP 100 PERCENT
*
FROM dbo.sysobjects
ORDER BY xtype',
@PageSize = 5,
@PageCurrent = 2,
@FdShow = 'name, xtype',
@FdOrder = 'xtype, name'
--*/
CREATE PROC dbo.p_show
@QueryStr nvarchar(4000), -- 表名、视图名、查询语句
@PageSize int=10, -- 每页的大小(行数)
@PageCurrent int=1, -- 要显示的页
@FdShow nvarchar (4000) = N'', -- 要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000) = N'' -- 排序字段列表
AS
SET NOCOUNT ON
DECLARE
@FdName sysname, --表中的主键或表、临时表中的标识列名
@Id1 sysname, --开始和结束的记录号
@Id2 sysname,
@Obj_ID int --对象ID
--表中有复合主键的处理
DECLARE
@strfd nvarchar(2000), --复合主键列表
@strjoin nvarchar(4000), --连接字段
@strwhere nvarchar(2000) --查询条件
SELECT
@Obj_ID = OBJECT_ID(@QueryStr),
@FdShow = CASE
WHEN @FdShow > N'' THEN N' ' + @FdShow
ELSE N' *'
END,
@FdOrder = CASE
WHEN @FdOrder > N'' THEN N' ORDER BY ' + @FdOrder
ELSE N' '
END,
@QueryStr = CASE
WHEN @Obj_ID IS NULL THEN N' (' + @QueryStr + N')A'
ELSE N' ' + @QueryStr
END
-- 如果显示第一页,可以直接用 top 来完成
IF @PageCurrent = 1
BEGIN
SELECT
@Id1 = CAST(@PageSize as varchar(20))
EXEC(N'
SELECT TOP ' + @Id1 + N'
' + @FdShow + N'
FROM ' + @QueryStr + N'
' + @FdOrder
)
RETURN
END
-- 如果是表, 则检查表中是否有标识更或主键
IF @Obj_ID IS NULL OR OBJECTPROPERTY(@Obj_ID, 'IsTable') = 0
GOTO lb_usetemp
ELSE
BEGIN
SELECT
@Id1 = CAST(@PageSize as varchar(20)),
@Id2 = CAST((@PageCurrent - 1) * @PageSize as varchar(20))
-- 标识列
SELECT
@FdName = name
FROM dbo.syscolumns
WHERE id = @Obj_ID
AND status = 0x80
IF @@ROWCOUNT = 0 --如果表中无标识列,则检查表中是否有主键
BEGIN
DECLARE
@pk_number int
SELECT
@strfd = N'',
@strjoin = N'',
@strwhere = N''
SELECT
@strfd = @strfd
+ N',' + QUOTENAME(name),
@strjoin = @strjoin
+ N' AND A.' + QUOTENAME(name)
+ N'=B.' + QUOTENAME(name),
@strwhere = @strwhere
+ N' AND B.' + QUOTENAME(name) + N' IS NULL'
FROM(
SELECT
IX.id, IX.indid,
IXC.colid, ixc.keyno,
C.name
FROM dbo.sysobjects O,
dbo.sysindexes IX,
dbo.sysindexkeys IXC,
dbo.syscolumns C
WHERE O.parent_obj = @Obj_ID
AND O.xtype = 'PK'
AND O.name = IX.name
AND IX.id = @Obj_ID
AND IX.id = IXC.id
AND IX.indid = IXC.indid
AND IXC.id = C.id
AND IXC.colid = C.colid
)A
ORDER BY keyno
SELECT
@pk_number = @@ROWCOUNT,
@strfd = STUFF(@strfd, 1, 1, N''),
@strjoin = STUFF(@strjoin, 1, 5, N''),
@strwhere = STUFF(@strwhere, 1, 5, N'')
IF @pk_number = 0
GOTO lb_usetemp --如果表中无主键,则用临时表处理
ELSE IF @pk_number = 1
BEGIN
SELECT
@FdName = @strfd
GOTO lb_useidentity -- 使用单一主键
END
ELSE
GOTO lb_usepk -- 使用复合主键
END
END
/**//*--使用标识列或主键为单一字段的处理方法--*/
lb_useidentity:
EXEC(N'
SELECT TOP ' + @Id1 + N'
' + @FdShow + N'
FROM '+@QueryStr + N'
WHERE ' + @FdName + ' NOT IN(
SELECT TOP ' + @Id2 + N'
' + @FdName + '
FROM ' + @QueryStr + N'
' + @FdOrder + N')
' + @FdOrder + N'
')
RETURN
/**//*--表中有复合主键的处理方法--*/
lb_usepk:
EXEC(N'
SELECT
' + @FdShow + N'
FROM(
SELECT TOP ' + @Id1 + N'
A.*
FROM ' + @QueryStr + N' A
LEFT JOIN(
SELECT TOP ' + @Id2 + N'
' + @strfd + N'
FROM ' + @QueryStr + N'
' + @FdOrder + N'
)B
ON ' + @strjoin + N'
WHERE ' + @strwhere + N'
' + @FdOrder + N'
)A
' + @FdOrder + N'
')
RETURN
/**//*--用临时表处理的方法--*/
lb_usetemp:
SELECT
@FdName = QUOTENAME(N'ID_' + CAST(NEWID() as varchar(40))),
@Id1 = CAST(@PageSize * (@PageCurrent-1) as varchar(20)),
@Id2 = CAST(@PageSize * @PageCurrent-1 as varchar(20))
EXEC(N'
SELECT
' + @FdName + N' = IDENTITY(int, 0, 1),
' + @FdShow + N'
INTO #tb
FROM(
SELECT TOP 100 PERCENT
*
FROM ' + @QueryStr + N'
' + @FdOrder + N'
)A
' + @FdOrder + N'
SELECT
' + @FdShow + N'
FROM #tb
WHERE ' + @FdName + ' BETWEEN ' + @Id1 + ' AND ' + @Id2 + N'
'
)
GO
分享到:
相关推荐
SQL Server 分页存储过程是一种在数据库中实现高效数据分页查询的方法。在大型数据集的展示中,分页是必不可少的,因为它允许用户逐步浏览数据,而不是一次性加载所有记录,从而提高用户体验并减少服务器负载。以下...
sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程
数据库存储过程,可直接使用,可直接传参数,可根据自己额需要进行修改~简单、快捷
### SQL Server 分页存储过程详解 #### 一、概述 分页是数据库操作中的常见需求之一,尤其是在构建大型Web应用程序时。SQL Server 提供了多种实现分页的方法,包括使用临时表、变量、子查询等技术。其中,利用存储...
### 标准SQL Server分页存储过程:深入解析与应用 在处理大量数据时,分页技术是提高数据展示效率和用户体验的关键。SQL Server提供的存储过程是实现分页功能的有效方式之一。本文将深入探讨微软C# .NET中的宠物...
综上所述,`SqlServer 分页存储过程`涉及到如何在SQL Server中有效地执行分页查询,这通常通过存储过程来实现,并可能利用`get_no.sql`来获取序列号或特定条件下的最大值。通过理解这些概念和技术,可以构建高效且...
通用 SQLSERVER 分页存储过程 代码超级简单实用
标题提到的“通用的SQL server分页存储过程”提供了一种解决方案,可以避免重复编写存储过程,只需调整参数即可满足不同分页需求。 分页存储过程的核心思想是利用`OFFSET`和`FETCH NEXT`这两个SQL Server 2012及更...
二、SQL Server的分页存储过程 在SQL Server中,可以使用`OFFSET`和`FETCH NEXT`语句实现分页。下面是一个简单的分页存储过程示例: ```sql CREATE PROCEDURE [dbo].[usp_GetPagedData] @TableName NVARCHAR(128)...
sql server,分页存储,过程,演示 sql server,分页存储,过程,演示 sql server,分页存储,过程,演示 sql server,分页存储,过程,演示 sql server,分页存储,过程,演示 sql server,分页存储,过程,演示 ...
首先,我们来理解SQL Server分页存储过程的工作原理。分页通常涉及到两个关键参数:当前页号(@CurrentPage)和每页记录数(@PageSize)。存储过程通过计算出开始和结束的记录索引,然后使用`OFFSET-FETCH`或`TOP-N`...
在SQL Server中,分页是...总的来说,SQL Server的分页存储过程是实现分页查询的一种方法,但随着技术的发展,还有其他更优化的策略可供选择。在实际应用中,应根据具体需求和数据库大小来决定最合适的分页实现方式。
sqlserver数据库数据分页功能,介绍了如何在sqlserver数据库汇总用存储过程进行数据分页
在"分页存储过程效率对比.doc"文档中,可能详细分析了每种方法的执行计划、资源消耗、响应时间等指标,通过实验数据来展示不同方法在实际应用中的性能差异。对比这些数据可以帮助我们理解在特定数据库结构和工作负载...
SQLServer分页存储过程通常有多个版本,但是效率上有高有低,经过测试排名为: 版本1:select max 版本2:row_number 版本3:not in 版本4:临时表 版本5:中间变量 如果主键为int,请使用版本1 如果主键为guid,...
通用的Sql Server分页程序,并且符合BootStrap Table 的调用标准.
很好的通过存储过程实现分页的技术,很好的通过存储过程实现分页的技术,很好的通过存储过程实现分页的技术