SQL里存储过程分页问题!急!急!

作者&投稿:夏毅 (若有异议请与网页底部的电邮联系)
存储过程分页问题~

index,size这些都是int,不是varchar。表名做参数,SQL语句必须拼接:
If (Object_id('pro','p') Is Not Null )
Drop proc pro
Go
Create Proc Pro
@index int,
@size int
As
Declare @Start int , @End int
Declare @Table varchar(100)
Declare @Sql varchar(8000)
Set @Start =(@index-1)*@size+1
Set @End =@Start+@size-1
Set @Table='table1'
Set @Sql='Select * From (Select * ,row_number()over(Order by id asc) as number From '+@Table+')T Where t.number Between '
+cast(@Start as varchar)+' And '++cast(@End as varchar)
Exec @sql

动态拼接语句,你可以在过程最后加一个print @strSQL 看得到的语句是否符合规则

a=‘’1‘’
注意字符串内的单引号用''表示

CREATE PROCEDURE [Zhzuo_GetItemsPage]
@PageIndex INT, /*@PageIndex从计数,0为第一页*/
@PageSize INT, /*页面大小*/
@RecordCount INT OUT, /*总记录数*/
@PageCount INT OUT /*页数*/
AS
/*获取记录数*/
SELECT @RecordCount = COUNT(*) FROM Production.Product
/*计算页面数据*/
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)
/*TOP记录数*/
DECLARE @TOPCOUNT INT
SET @TOPCOUNT = @RecordCount - @PageSize * @PageIndex

DECLARE @SQLSTR NVARCHAR(1000)

IF @PageIndex = 0 OR @PageCount <= 1
BEGIN
SET @SQLSTR =N'SELECT TOP '+STR(@PageSize)+
'ProductID,Name FROM Production.Product ORDER BY ProductID DESC'
END
ELSE
BEGIN
IF @PageIndex = @PageCount - 1
BEGIN
SET @SQLSTR =N'SELECT * FROM ( SELECT TOP ' + STR(@TOPCOUNT) +
'ProductID,Name FROM Production.Product ORDER BY ProductID ASC) T ORDER BY ProductID DESC'
END
ELSE
BEGIN
SET @SQLSTR =N' SELECT TOP '+STR(@PageSize)+'* FROM (SELECT TOP ' + STR(@TOPCOUNT) +
'ProductID,Name FROM Production.Product ORDER BY ProductID ASC) T ORDER BY ProductID DESC'
END
END
/*执行*/
EXEC (@SQLSTR)

以上存储过程对页数进行判断,如果是第一页或最后一页,进行特殊处理。其他情况使用2次TOP翻转。其中排序条件为ProductID倒序。最后通过EXECUTE执行SQL字符串拼串。

2.SQL SERVER 2005中的TOP分页
CREATE PROCEDURE [dbo].[Zhzuo_GetItemsPage2005TOP]
@PageIndex INT,
@PageSize INT,
@RecordCount INT OUT,
@PageCount INT OUT
AS
/*获取记录数*/
SELECT @RecordCount = COUNT(*) FROM Production.Product
/*计算页面数据*/
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)
/*TOP记录数*/
DECLARE @TOPCOUNT INT
SET @TOPCOUNT = @RecordCount - @PageSize * @PageIndex

/*基于SQL SERVER 2005 */
IF @PageIndex = 0 OR @PageCount <= 1
BEGIN
SELECT TOP(@PageSize) ProductID,Name FROM Production.Product ORDER BY ProductID DESC
END
ELSE
BEGIN
IF @PageIndex = @PageCount - 1
BEGIN
SELECT * FROM ( SELECT TOP(@TOPCOUNT) ProductID,Name FROM Production.Product ORDER BY ProductID ASC) T
ORDER BY ProductID DESC
END
ELSE
BEGIN
SELECT TOP(@PageSize) * FROM (SELECT TOP(@TOPCOUNT) ProductID,Name FROM Production.Product ORDER BY ProductID ASC) T
ORDER BY ProductID DESC
END
END
以上存储过程是使用2005的TOP (表达式) 新功能,避免了字符串拼串,使结构化查询语言变得简洁。实现的为同样的功能。

3.SQL SERVER 2005中的新分页
CREATE PROCEDURE [dbo].[Zhzuo_GetItemsPage2005]
@PageIndex INT,
@PageSize INT,
@RecordCount INT OUT,
@PageCount INT OUT
AS
/*获取记录数*/
SELECT @RecordCount = COUNT(*) FROM Production.Product
/*计算页面数据*/
SET @PageCount = CEILING(@RecordCount * 1.0 / @PageSize)
/* 基于SQL SERVER 2005 */
SELECT SerialNumber,ProductID,Name FROM
(SELECT ProductID,Name,ROW_NUMBER() OVER (ORDER BY ProductID DESC) AS SerialNumber FROM Production.Product ) AS T
WHERE T.SerialNumber > (@PageIndex * @PageSize) and T.SerialNumber <= ((@PageIndex+1) * @PageSize)

第三个存储过程使用2005下新的功能,实现的分页存储过程功能更加简单明了,而且更加容易理解。注意这里的ProductID为主键,根据ProductID进行排序生成ROW_NUMBER,通过ROW_NUMBER来确定具体的页数。

通过对三个分页存储过程的比较,可见SQL SERVER 的TSQL 语言对分页功能的支持进步不少。使分页实现趋向于简单化。

顺便,说下,我单独执行这条语句答案是正确的!

SELECT TOP 12 * FROM [Goods] WHERE [CosmeticsId] NOT IN
(SELECT TOP 12 [CosmeticsId] FROM [Goods]) and [GoodCategory] = '服饰'
---------------------
这样写法都是错误的,在外面同样需要加上条件[GoodCategory] = '服饰'

--修改为以下方式,注意括号和字符串的引号.
alter proc [dbo].[sp_Pages]
@page int,
@t nvarchar(50)
AS
DECLARE @number2 INT
SET @number2=12*(@page-1)
DECLARE @sql NVARCHAR(max)
set @sql='SELECT TOP 12 * FROM [Goods] WHERE [CosmeticsId] NOT IN
(SELECT TOP '+CAST(@number2 AS VARCHAR(20)) +' [CosmeticsId] FROM [Goods] and [GoodCategory] = '''+CAST(@t AS VARCHAR(20))+''')'
+' and [GoodCategory] = '''+CAST(@t AS VARCHAR(20))+''''
EXEC sp_executesql @sql
RETURN
go
exec sp_Pages 2,'服饰'

--生成格式为
SELECT TOP 12 * FROM [Goods] WHERE [CosmeticsId] NOT IN
(SELECT TOP 12 [CosmeticsId] FROM [Goods] and [GoodCategory] = '服饰') and [GoodCategory] = '服饰'


可以任意字段排序 但是要分页的一个sql存储过程怎么写呀 是写在一个...
并且这些需要分页的地方有一个共同的特点,那就是,分页,但并不是按ID(主键)来排序,而是要求按其他有重复值的列进行排序,比如,其中有一个页面,要列出将近1万条客户记录,要求按客户付费金额进行排序,这种情况,如果使用网上流行的通用分页存储过程是行不能的,比如,像下面的分页存储过程虽然很棒,可是,用在这里的话,...

SQL分页与存储过程分页是一样的吗
SQL分页:SQL数据是以页为单位存储在文件中的,每个页面8KB。当往一个页面中插入或者修改数据并会导致该页面的数据会超出8KB时,SQL Server就会将页面拆分成两页,从而能够容纳新插入的数据。存储过程分页是另外一个概念。当查询返回的结果集很大时,为了提高效率,将结果集分成若干小页面,并只将用户当...

SQL如何实现数据分页,要具体语句,谢谢
分页存储过程如下 CREATE PROCEDURE GetRecordFromPage tblName varchar(255), -- 表名 RetColumns varchar(1000) = '*', -- 需要返回的列,默认为全部 Orderfld varchar(255), -- 排序字段名 PageSize int = 10, -- 页尺寸 PageIndex int = ...

oracle存储过程分页 java调用时候出现 无法转换为内部表示 什么问题...
to_char(参数,格式),比如to_char(1234,'0000'),to_char(sysdate,'YYYYMMDD')等,to_number(参数,格式),比如to_number(9999,'$9999.99'),to_number(99.99,'99')等

sql 存储过程分页(asp.net)
--用途:分页存储过程 --说明:--- Create PROCEDURE [dbo].[UP_GetRecordByPage]tblName varchar(255),-- 表名 fldName varchar(255),-- 排序字段名 PageSize int = 10,-- 页尺寸 PageIndex int = 1,-- 页码 IsReCount bit = 0,-- 返回记录总数,非 0 值则返回 OrderType bit = 0,-...

存储过程分页,字符串为主键的表的分页,主键无序
--取得分页总数 set @pageCount=(@tmpCounts+@pageSize-1)\/@pageSize \/**\/\/**当前页大于总页数 取最后一页**\/ if @page>@pageCount set @page=@pageCount --\/*---数据分页2分处理---*\/ declare @pageIndex int --总数\/页大小 declare @lastcount int --总数%页大小 set @pageIndex ...

...server存储过程实现查询数据条数过大,分页查询怎么实现?
(1)、将全部数据先查询到内存中,然后在内存中进行分页,这种方式对内存占用较大,必须限制一次查询的数据量。(2)、采用存储过程在数据库中进行分页,这种方式对数据库的依赖较大,不同的数据库实现机制不通,并且查询效率不够理想。以上两种方式对用户来说都不够友好。2.解决思路 通过在待查询的...

求一个sql存储过程分页。支持多表联合查询,模糊查询!
PageCount bigint output,--总页数 Pages bigint output --当前页 as if @Pages<=0 --判断页数 set @Pages=1 declare @指针定位 bigint set @指针定位=9*(@Pages-1)--这个是每页10条 declare @hid bigint,--获取定位Id 主要是用自增值判断的 余数 bigint--存余数 这个余数是 记录数...

sql存储过程分页 临时表问题
FROM 表 ORDER BY id) AS T))ORDER BY ID --- 分页方案三:(利用SQL的游标存储过程分页)create procedure XiaoZhengGe sqlstr nvarchar(4000), --查询字符串 currentpage int, --第N页 pagesize int --每页行数 as set nocount on ...

存储过程执行的结果集如何分页
你可以在程序中写一个分页类,来控制分页,代码我没在这只能给你说下思路,在程序里保存例如用一个泛型保存存储过程查出的结果集,在通过传入的页码增长或减少来控制取得泛型里的前五个或后五个。如果想要再详细的代码,你再说一声,我再给你找找 ...

慈溪市17382235393: SQL 分页存储过程问题,明天就要交项目了..这里还有点问题,帮帮忙 -
怀牧忆复: 余数=总数据行%每页数据行数if(余数!=0){ 总页数=总数据行/每页数据行数+1}else{ 总页数=总数据行/每页数据行数}

慈溪市17382235393: sql存储过程分页
怀牧忆复: 告诉你个更简单的: alter proc up_MyBookShop_GetRow1 @pageSize int=10,--每页显示的条数 @pageIndex int=1,--当前要显示的页码 @tableName varchar(100),--表名 @rowCount int output--总行数 as declare @num1 int--第一个数 ...

慈溪市17382235393: SQLServer数据库存储过程分页是怎样的 -
怀牧忆复: 存储过程:create Procedure pname( @pageIndex int,@pageSize) as select * from tableName order by id offset @pageIndex * pageSize fetch next pageSize rows only 分页:sqlserver 在2008之前 使用 top 和 not int top 的方式来做分页2008以后...

慈溪市17382235393: sql server 分页存储过程 -
怀牧忆复: CREATE PROCEDURE pagination @tblName varchar(255), -- 表名@strGetFields varchar(1000) = '*', -- 需要返回的列@fldName varchar(255)='', -- 排序的字段名@PageSize int = 10, -- 页尺寸@PageIndex int = 1, -- 页码@doCount ...

慈溪市17382235393: SQL如何实现数据分页,要具体语句,谢谢 -
怀牧忆复: 可以的,用存储过程分页存储过程如下CREATE PROCEDURE GetRecordFromPage@tblName varchar(255), -- 表名@RetColumns varchar(1000) = '*', -- 需要返回的列,默认为全部@Orderfld varchar(255), -- 排序字段名@PageSize ...

慈溪市17382235393: 如何运行sql server分页存储过程 -
怀牧忆复: 给对应的值,然后执行 go create proc Fenye @pageindex int, --用户要查询的页码 @pagesize int, --每页几条 @pagecount int output, --一共查询了多少页 @recordcount int output --一共有多少条数据 as begin --把用户要的数据查询出来 --先...

慈溪市17382235393: SQL 存储过程分页怎么搞..有的帮帮.最好有实例???
怀牧忆复: 使用时,首次调用,将@docount设为1,获得满足条件的记录行数 以后调用时,将@docount设为0,获得指定页的记录 CREATE procedure pageer_rnewlist (@pagesize int, @pageindex int, @docount bit, @education varchar(50) ) as set ...

慈溪市17382235393: 具有分页功能的存储过程?(sql代码) -
怀牧忆复: 分页方案一:(利用Not In和SELECT TOP分页) 语句形式: SELECT TOP 10 * FROM TestTable WHERE (ID NOT IN (SELECT TOP 20 id FROM TestTable ORDER BY id)) ORDER BY ID SELECT TOP 页大小 * FROM TestTable WHERE (ID ...

慈溪市17382235393: 请教SQL高手一个随机分页的通用存储过程 -
怀牧忆复: 你看看这样处理可以不 ,就是不能随机排序 Declare @PageSize int, --页尺寸 Select ceiling(ID*1.0/@PageSize) as '页码',* from ( Select ROW_NUMBER() over (order by code) as ID,* from table) T

慈溪市17382235393: 用Sql写一个分页查询的存储过程 表stuinfo主键stuno -
怀牧忆复: 随便你怎么填!/****** 对象: StoredProcedure [dbo].[usp_DataPagination_v1] 脚本日期: 09/03/2010 16:52:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[usp_DataPagination_v1] ( @...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网