sqlserver表分页,sqlserver的分页

SQLSERVER如何实现分页查询?

写存储过程 ..

目前创新互联公司已为数千家的企业提供了网站建设、域名、雅安服务器托管、网站改版维护、企业网站设计、桦川网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO

ALTER PROCEDURE usp_Province_pagination

@PageSize INT, --每页的显示的行数

@AbsolutePage INT, -- 当前页的页数

@PageCount INT OUTPUT --总页数

AS

DECLARE @BeginRecord INT --记录每此从哪一行开始读取

DECLARE @RecordCount INT --表中数据的总条数

DECLARE @sql NVARCHAR(1000)

SET @RecordCount = (SELECT count(*) FROM Province)

--表中没有数据的情况

IF @RecordCount = 0

BEGIN

SET @PageCount = 0

RETURN(0)

END

-- 表中的总条数大于定义的每页的行数的情况

IF @RecordCount @PageSize

BEGIN

-- 计算总能分多少页

SET @PageCount = (@RecordCount + @PageSize - 1)/@PageSize

--当前应该从哪一行开始读取

SET @BeginRecord = ((@AbsolutePage-1) * @PageSize)

SET @sql = N'SELECT TOP ' + cast(@PageSize AS NVARCHAR(100)) +' ProvinceID, provinceCode, ProvinceName

FROM Province

WHERE ProvinceID NOT IN

(SELECT TOP '+ CAST(@BeginRecord AS NVARCHAR(100)) + ' ProvinceID

FROM Province)'

EXECUTE sp_executesql @sql

END

ELSE -- -- 表中的总条数大于定义的每页的行数情况

BEGIN

SET @PageCount = 1

SET @SQL = 'SELECT ProvinceID, provinceCode, ProvinceName FROM Province '

EXECUTE sp_executesql @sql

END

GO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

数据库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以后使用 row_number() 函数作为分页关键函数

2012使用 offset 1 fetch next 10 rows only

你问了2个问题,你可以优先把视图,存储过程,触发器等弄明白,分页是查询,在存储过程里可以写复杂的sql文,只是在运行时是预编译和参数化查询防止sql注入

sqlserver 2005数据库 怎么进行分页

分两步实现

一、分页的存储过程如下

set ANSI_NULLS ON

set QUOTED_IDENTIFIER ON

go

CREATE PROCEDURE [dbo].[Pagination]

@tblName varchar(255), -- 表名

@strGetFields varchar(1000) , -- 需要返回的列

@fldName varchar(255), -- 排序的字段名

@PageSize int, -- 页尺寸

@PageIndex int , -- 页码

@doCount bit=0, -- 返回记录总数, 非 0 值则返回

@OrderType bit, -- 设置排序类型, 非 0 值则降序

@strWhere varchar(1500) -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL varchar(5000) -- 主语句

declare @strTmp varchar(110) -- 临时变量

declare @strOrder varchar(400) -- 排序类型

if @doCount != 0

begin

if @strWhere !=''

set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere

else

set @strSQL = 'select count(*) as Total from [' + @tblName + ']'

end

--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

else

begin

if @OrderType != 0

begin

set @strTmp = '(select min'

set @strOrder = ' order by [' + @fldName + '] desc'

end

--如果@OrderType不是0,就执行降序,这句很重要!

else

begin

set @strTmp = '(select max'

set @strOrder = ' order by [' + @fldName + '] asc'

end

if @PageIndex = 1

begin

if @strWhere != ''

set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields + ' from [' + @tblName + '] where '

+ @strWhere + ' ' + @strOrder

else

set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields

+ ' from [' + @tblName + '] ' + @strOrder

end

--如果是第一页就执行以上代码,这样会加快执行速度

else

begin

--以下代码赋予了@strSQL以真正执行的SQL代码

set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields + ' from ['

+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top '

+ str( ( @PageIndex - 1 ) * @PageSize ) + ' ['+ @fldName + '] from [' + @tblName + ']'

+ @strOrder + ') as tblTmp)' + @strOrder

if @strWhere != ''

set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields + ' from ['

+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['

+ @fldName + ']) from (select top ' + str( ( @PageIndex - 1 ) * @PageSize ) + ' ['

+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '

+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

end

end

exec(@strSQL)

二、页面调用部分代码

Function navindex(ByVal PageIndextemp As Integer, ByVal PageSizetemp As Integer, ByVal countint As Integer, ByVal pagename As String) As String

Dim i As Integer

If countint Mod PageSizetemp = 0 Then

i = countint \ PageSizetemp

Else

i = countint \ PageSizetemp + 1

End If

Dim maxi, mini As Integer

Dim navleft, navright, navstrtemp As String

If i 10 Then

maxi = i

mini = 1

Else

maxi = pageindex + 3

mini = pageindex - 3

If mini 1 Then

navleft = "a href=""" pagename "?page=" (mini - 1) """ class=""link_nav_btn""/a "

Else

mini = 1

maxi = 10

End If

If maxi i Then

navright = " a href=""" pagename "?page=" (maxi + 1) """ class=""link_nav_btn""/a"

Else

If i - 10 0 Then

mini = i - 10

Else

mini = 1

End If

maxi = i

End If

End If

For n As Integer = mini To maxi

If n = pageindex Then

navstrtemp = navstrtemp " a href=""" pagename "?page=" n """ class=""link_nav_btn_select""b" n "/b/a"

Else

navstrtemp = navstrtemp " a href=""" pagename "?page=" n """ class=""link_nav_btn""" n "/a"

End If

Next

navstrtemp = navleft navstrtemp navright

Return navstrtemp

End Function

Sub databinds(ByVal tblnametemp As String, ByVal strGetFieldstemp As String, ByVal fldNametemp As String, ByVal PageSizetemp As Integer, ByVal PageIndextemp As Integer, ByVal OrderTypetemp As Short, ByVal strWheretemp As String)

'tblnametemp表名,strGetFieldstemp需要返回的列,fldNametemp排序的字段名,PageSizetemp页尺寸,PageIndextemp页码,OrderTypetemp设置排序类型,strWheretemp查询条件

'总数

cmdTM = New SqlCommand("select count(*) from " tblnametemp " where " strWheretemp, conPubs)

conPubs.Open()

countint = CInt(cmdTM.ExecuteScalar())

conPubs.Close()

'导航

navstr = navindex(PageIndextemp, PageSizetemp, countint, "newshyxh.aspx")

'分页

cmdTM = New SqlCommand("Pagination", conPubs)

cmdTM.CommandType = CommandType.StoredProcedure

'add input

cmdTM.Parameters.Add("@tblName", SqlDbType.VarChar, 255).Value = tblnametemp

cmdTM.Parameters.Add("@strGetFields", SqlDbType.VarChar, 1000).Value = strGetFieldstemp

cmdTM.Parameters.Add("@fldName", SqlDbType.VarChar, 255).Value = fldNametemp

cmdTM.Parameters.Add("@PageIndex", SqlDbType.Int).Value = PageIndextemp

cmdTM.Parameters.Add("@PageSize", SqlDbType.Int).Value = PageSizetemp

cmdTM.Parameters.Add("@OrderType", SqlDbType.Bit).Value = OrderTypetemp

cmdTM.Parameters.Add("@strWhere", SqlDbType.VarChar, 1500).Value = strWheretemp

conPubs.Open()

newsright.DataSource = cmdTM.ExecuteReader()

newsright.DataBind()

conPubs.Close()

End Sub

SQL Server 分页 查询语句

四种方式实现SQLServer 分页查询

SQLServer 的数据分页:

假设现在有这样的一张表:

CREATE TABLE test

(

id int primary key not null identity,

names varchar(20)

)

然后向里面插入大约1000条数据,进行分页测试

假设页数是10,现在要拿出第5页的内容,查询语句如下:

--10代表分页的大小

select top 10 *

from test

where id not in

(

--40是这么计算出来的:10*(5-1)

select top 40 id from test order by id

)

order by id

原理:需要拿出数据库的第5页,就是40-50条记录。首先拿出数据库中的前40条记录的id值,然后再拿出剩余部分的前10条元素

第二种方法:

还是以上面的结果为例,采用另外的一种方法

--数据的意思和上面提及的一样

select top 10 *

from test

where id

(

select isnull(max(id),0)

from

(

select top 40 id from test order by id

) A

)

order by id

原理:先查询前40条记录,然后获得其最id值,如果id值为null的,那么就返回0

然后查询id值大于前40条记录的最大id值的记录。

这个查询有一个条件,就是id必须是int类型的。

第三种方法:

select top 10 *

from

(

select row_number() over(order by id) as rownumber,* from test

) A

where rownumber 40

原理:先把表中的所有数据都按照一个rowNumber进行排序,然后查询rownuber大于40的前十条记录

这种方法和oracle中的一种分页方式类似,不过只支持2005版本以上的

第四种:

存储过程查询

创建存储过程

alter procedure pageDemo

@pageSize int,

@page int

AS

declare @temp int

set @temp=@pageSize*(@page - 1)

begin

select top (select @pageSize) * from test where id not in (select top (select @temp) id from test) order by id

end

执行存储过程

exec 10,5


分享标题:sqlserver表分页,sqlserver的分页
标题链接:http://pwwzsj.com/article/dsccosc.html