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