数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

sql存储过程分页


发布日期:2024年03月24日
 
sql存储过程分页

CREATE PROC myx_prPageRecordset

@queryStr nvarchar()

@keyField nvarchar ()

@pageSize int

@pageNumber int

AS

BEGIN

DECLARE @sqlText AS nvarchar()

DECLARE @sqlTable AS nvarchar()

SET @sqlTable = SELECT TOP + CAST((@pageNumber + ) * @pageSize AS varchar()) + + @queryStr

SET @sqlText =

SELECT TOP + CAST(@pageSize AS varchar()) + * +

FROM ( + @sqlTable + ) AS tableA +

WHERE + @keyField + NOT IN(SELECT TOP +

CAST(@pageNumber * @pageSize AS varchar()) + + @keyField +

FROM ( + @sqlTable + ) AS tableB)

EXEC (@sqlText)

END

GO

核心代码

Dim strsql As String

myComm = New SqlClientSqlCommand(myx_prPageRecordset myConn)

myCommCommandType = CommandTypeStoredProcedure

myCommParametersAdd(New SqlClientSqlParameter(@queryStr SqlDbTypeNVarChar ))

myCommParameters(@queryStr)Value = * from tbpage order by id DESC

myCommParametersAdd(New SqlClientSqlParameter(@keyField SqlDbTypeNVarChar ))

myCommParameters(@keyField)Value = [id]

myCommParametersAdd(New SqlClientSqlParameter(@pageSize SqlDbTypeNVarChar ))

myCommParameters(@pageSize)Value = PageSize

myCommParametersAdd(New SqlClientSqlParameter(@pageNumber SqlDbTypeNVarChar ))

myCommParameters(@pageNumber)Value = myPage

呵呵执行几W条的代码只需毫秒左右

建立一个test(idnamefid)

向test添充几十条数据使id=(即递增的integer)其他任意在Tsql Debugger给改存储过程分别传递如下参数:

@queryStr= * from test

@keyField=[ID]

@pageSize=

@pageNumber=

问题出来了看输出结果(注意id):

id name fid

kwklover

kwklover

kwklover

根据传入参数我们的预期应该是:

id name fid

kwklover

kwklover

kwklover

下面是我参照小春的存储分页写的分页存储过程可以解决上面的问题:

CREATE Procedure prGetRecordByPage

(

@PageSize int 每页的记录条数

@PageNumber int 当前页面

@QuerySql varchar()部分查询字符串如* From Test order by id desc

@KeyField varchar()

)

AS

Begin

Declare @SqlTable AS varchar()

Declare @SqlText AS Varchar()

Set @SqlTable=Select Top +CAST(@PageNumber*@PageSize AS varchar())+ +@QuerySql

Set @SqlText=Select Top +Cast(@PageSize AS varchar())+ * From

+(+@SqlTable+) As TembTbA

+Where +@KeyField+ Not In (Select Top +CAST((@PageNumber)*@PageSize AS varchar())+ +@KeyField+ From

+(+@SqlTable+) AS TempTbB)

Exec(@SqlText)

End

GO

               

上一篇:小议Oracle11g的自治事务(三)

下一篇:在Oracle9中伪造存储概要