存储过程|分页|速度存储过程:
ALTER PROCEDURE spPagination
FieldList Nvarchar(200),--字段列表
TableName Nvarchar(20), --表名
WhereStr Nvarchar(500),--条件语句(须写完整,如"where Name='sea' and image=0",如果使用OR语句,须用():如:"Where (Name='sea' OR image=0)"
PrimaryKey Nvarchar(20),--主键
SortStr Nvarchar(100),--排序语句(须写完整,如"Order By ID,Nname")
SortStrDesc Nvarchar(100), --倒序语句(须写完整,如"Order By ID desc,Nname desc")
PageSize int,--页记录数
PageNo int,--页码
RecordCount int OUTPUT,--返回记录总数
PageCount int OUTPUT--返回页总数
AS
/*定义局部变量*/
declare intBeginID nvarchar(20)
declare intEndID nvarchar(20)
declare intRecordCount int
declare intRowCount int
declare TmpSelect NVarchar(600)
/*关闭计数*/
set nocount on
/*
set PageNo=7
set PageSize=2
set SortStr='order by subproclassid, ProductID'
set SortStrDesc='order by subproclassid desc, ProductID desc'
*/
/*求总记录数*/
Set TmpSelect = 'set nocount on;select SPintRootRecordCount = count(*) from '+TableName+' '+WhereStr
execute sp_executesql
TmpSelect,
N'SPintRootRecordCount int OUTPUT',
SPintRootRecordCount=intRecordCount OUTPUT
/*返回总记录数*/
set RecordCount = intRecordCount
if intRecordCount=0
--没有记录则返回一个空记录集
Begin
Set TmpSelect='Select ' + FieldList + ' from '+TableName+' '+WhereStr
Execute sp_executesql TmpSelect
set RecordCount=0
set PageCount=1
End
else
--有记录则返回记录集
begin
/*返回总页数*/
if intRecordCount <> 0
begin
set PageCount=floor((intRecordCount+1.0-1.0) / PageSize)
if PageCount<(intRecordCount+1.0-1.0) / PageSize
set PageCount=PageCount+1
end
else
set PageCount=0
/*判断页码是否正确
如果页码小于1,设置页码为1,如果页码大于总页数,设置页码为总页数*/
if PageNo<1
set PageNo=1
else
if PageNo>PageCount
set PageNo=PageCount
/*求结束记录位置*/
set intRowCount = PageNo * PageSize
/*如果是最后页则返回余下的记录*/
if PageNo=PageCount
set PageSize=RecordCount - (PageNo-1) * PageSize
/* 开始分页 */
set TmpSelect= 'select * from ' + TableName + ' where ' + PrimaryKey + ' = any ('
set TmpSelect=TmpSelect + 'select top ' + str(PageSize) + ' ' + PrimaryKey + ' from ' + TableName + ' where ' + PrimaryKey + ' in (select top ' + str(intRowCount) + ' ' + PrimaryKey + ' from ' + TableName
set TmpSelect=TmpSelect + ' ' + WhereStr + ' ' + SortStr + ') ' + SortStrDesc
set TmpSelect=TmpSelect + ') ' + SortStr
execute sp_executesql TmpSelect
end
/*返回受上一行影响的行数*/
return rowcount
VB类:
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports System.Configuration
Namespace Gyone.DataAccess
Public Class Pagination
Private connStr As String = ConfigurationSettings.AppSettings("connStr")
Private dsCommand As New SqlDataAdapter()
'------------------------------------------------------------------------------------------------
Private _FieldList As String = "*"
Private _TableName As String
Private _WhereStr As String = ""
Private _PrimaryKey As String
Private _SortStr As String = ""
Private _SortStrDesc As String
Private _PageSize As Integer = 15
Private _PageNo As Integer = 1
Private _RecordCount As Integer
Private _PageCount As Integer
'-------------------------------------------------------------------------------------------------
'定义字段列表属性
Public Property FieldList() As String
Get
Return _FieldList
End Get
Set(ByVal Value As String)
_FieldList = Value
End Set
End Property
'-------------------------------------------------------------------------------------------------------
'定义表名属性
Public Property TableName() As String
Get
Return _TableName
End Get
Set(ByVal Value As String)
_TableName = Value
End Set
End Property
'-------------------------------------------------------------------------------------------------------
'定义条件语句属性,须写完整,如"Where Id=5 And Name='sea'",如使用了"Or"语句,则须用()括住如:"Where (Id=5 Or Name='sea')"
Public Property WhereStr() As String
Get
Return _WhereStr
End Get
Set(ByVal Value As String)
_WhereStr = "Where " & Value
End Set
End Property
'----------------------------------------------------------------------------------------------------
'定义主键
Public Property PrimaryKey() As String
Get
Return _PrimaryKey
End Get
Set(ByVal Value As String)
_PrimaryKey = Value
End Set
End Property
'--------------------------------------------------------------------------------------------------------
'定义排序语句属性,须写完整,如"Order By Id Desc,Name"
Public Property SortStr() As String
Get
Return _SortStr
End Get
Set(ByVal Value As String)
_SortStr = "Order By " & Value
Dim s() As String = Value.Split(",")
Dim i As String
_SortStrDesc = Nothing
For Each i In s
If _SortStrDesc = Nothing Then
If InStr(i.ToUpper, "DESC") > 0 Then
_SortStrDesc = "Order By " & i.ToUpper.Replace("DESC", "")
Else
_SortStrDesc = "Order By " & i & " DESC"
End If
Else
If InStr(i, "desc") > 0 Then
_SortStrDesc += "," & i.ToUpper.Replace("DESC", "")
Else
_SortStrDesc += "," & i & " DESC"
End If
End If
Next
End Set
End Property
'-------------------------------------------------------------------------------------------------------
'定义页记录数属性
Public Property PageSize() As Integer
Get
Return _PageSize
End Get
Set(ByVal Value As Integer)
_PageSize = Value
End Set
End Property
'--------------------------------------------------------------------------------------------------------
'定义页码属性
Public Property PageNo() As Integer
Get
Return _PageNo
End Get
Set(ByVal Value As Integer)
_PageNo = Value
End Set
End Property
'-----------------------------------------------------------------------------------------------------------
'定义总记录数属性(只读)
Public ReadOnly Property RecordCount() As Integer
Get
Return _RecordCount
End Get
End Property
'---------------------------------------------------------------------------------------------------------
'定义页总数属性(只读)
Public ReadOnly Property PageCount() As Integer
Get
Return _PageCount
End Get
End Property
'----------------------------------------------------------------------------------------------------------
'定义分页方法
Public Function Pagination() As DataSet
Dim Data As New DataSet(TableName)
Dim objCmd As New SqlCommand("spPagination", New SqlConnection(connStr))
objCmd.CommandType = CommandType.StoredProcedure
With objCmd.Parameters
.Add(New SqlParameter("FieldList", SqlDbType.NVarChar, 200))
.Add(New SqlParameter("TableName", SqlDbType.NVarChar, 20))
.Add(New SqlParameter("WhereStr", SqlDbType.NVarChar, 500))
.Add(New SqlParameter("PrimaryKey", SqlDbType.NVarChar, 20))
.Add(New SqlParameter("SortStr", SqlDbType.NVarChar, 100))
.Add(New SqlParameter("SortStrDesc", SqlDbType.NVarChar, 100))
.Add(New SqlParameter("PageSize", SqlDbType.Int))
.Add(New SqlParameter("PageNo", SqlDbType.Int))
.Add(New SqlParameter("RecordCount", SqlDbType.Int))
.Add(New SqlParameter("PageCount", SqlDbType.Int))
.Item("FieldList").Value = _FieldList
.Item("TableName").Value = _TableName
.Item("WhereStr").Value = _WhereStr
.Item("PrimaryKey").Value = _PrimaryKey
.Item("SortStr").Value = _SortStr
.Item("SortStrDesc").Value = _SortStrDesc
.Item("PageSize").Value = _PageSize
.Item("PageNo").Value = _PageNo
.Item("RecordCount").Direction = ParameterDirection.Output
.Item("PageCount").Direction = ParameterDirection.Output
End With
dsCommand.SelectCommand = objCmd
dsCommand.Fill(Data, TableName)
_RecordCount = dsCommand.SelectCommand.Parameters("RecordCount").Value
_PageCount = dsCommand.SelectCommand.Parameters("PageCount").Value
Return Data
End Function
End Class
End Namespace
再来一个分页的存储过程,这可比别的好多了,就是不知速度如何!
80酷酷网 80kuku.com