在网上看见的一个 分页存储过程 怎么调用啊?

gz116 2009-12-04 09:39:18
分页存储过程如下:

/*分页存储过程
Descript:分页存储过程
Author:Blue.Dream
Date:2004-8-18 21:01
*/
Create PROCEDURE ListPage(
@tblName nvarchar(200), ----要显示的表或多个表的连接
@fldName nvarchar(200) = '*', ----要显示的字段列表
@pageSizeint = 10, ----每页显示的记录个数
@pageint = 1, ----要显示那一页的记录
@pageCountint = 1 output, ----查询结果分页后的总页数
@Countsint = 1 output, ----查询到的记录数
@fldSortnvarchar(100) = null, ----排序字段列表或条件
@Sortbit = 0, ----排序方法,0为升序,1为降序
@strConditionnvarchar(200) = null,----查询条件,不需where
@IDnvarchar(50)----主表的主键
)
AS
SET NOCOUNT ON
Declare @sqlTmp nvarchar(1000)----存放动态生成的SQL语句
Declare @strTmp nvarchar(1000)----存放取得查询结果总数的查询语句
Declare @strID nvarchar(1000)----存放取得查询开头或结尾ID的查询语句
Declare @sqlSort nvarchar(200)----存放临时生成的排序条件
Declare @intCounts int----要移动的记录数
Declare @BeginID int----开始的ID
Declare @EndID int----结束的ID
--------首先生成排序方法---------
if @Sort=0--升序
begin
if not(@fldSort is null)
set @sqlSort = ' Order by ' + @fldSort
else
set @sqlSort = ' Order by ' + @ID
end
else--降序
begin
if not(@fldSort is null)
set @sqlSort = ' Order by ' + @fldSort + ' DESC'
else
set @sqlSort = ' Order by ' + @ID + ' DESC '
end
--------生成查询语句--------
--此处@strTmp为取得查询结果数量的语句
if @strCondition is null--没有设置显示条件
begin
set @sqlTmp = @fldName + ' From ' + @tblName
set @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblName
set @strID = ' From ' + @tblName
end
else
begin
set @sqlTmp = + @fldName + 'From ' + @tblName + ' where ' + @strCondition
set @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblName + ' where ' + @strCondition
set @strID = ' From ' + @tblName + ' where ' + @strCondition
end
----取得查询结果总数量-----
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
--取得分页总数
if @Counts <= @pageSize
set @pageCount = 1
else
set @pageCount = (@Counts / @pageSize) + 1
--计算要移动的记录数
if @page = 1
set @intCounts = @pageSize
else
begin
set @intCounts = (@page-1) * @pageSize + 1
end
-----取得分页后此页的第一条记录的ID
set @strID = 'select @BeginID=' + @ID + ' ' + @strID
set @intCounts = @intCounts - @pageSize + 1
set rowcount @intCounts
exec sp_executesql @strID,N'@BeginID int out ',@BeginID out
-----取得分页后此页的最后一条记录的ID
set @intCounts = @intCounts + @pageSize - 1
print @intCounts
set rowcount @intCounts
exec sp_executesql @strID,N'@BeginID int out ',@EndID out
------恢复系统设置-----
set rowcount 0
SET NOCOUNT OFF
------返回查询结果-----
if @strCondition is null
set @strTmp = 'select ' + @sqlTmp + ' where ' + @ID + ' between ' + str(@BeginID) + ' and ' + str(@EndID)
else
set @strTmp = 'select ' + @sqlTmp + ' where ' + @ID +' (between ' + str(@BeginID) + ' and ' + str(@EndID) + ') and ' + @strCondition
if not(@sqlSort is null)
set @strTmp = @strTmp + @sqlSort
exec sp_executesql @strTmp
GO


怎么调用呢?给你例子~~~~~~~~~~~
...全文
635 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
woaijiaojiao1314 2011-06-02
  • 打赏
  • 举报
回复
public static DataTable GetDataTableSY_Role(string strOrderbyCols, int iSortType, int iPageSize, int iPageIndex, ref int iPagesNum, ref int iSizeMode, ref int iTotalRowsCount, ref string strErrorMessage)
{
DataTable dt = new DataTable();
SqlConnection sqlConn = new SqlConnection(WindowsFormsApplication1.Common.SystemClass.strSqlConnection);
SqlCommand sqlCmd = new SqlCommand("SY_RoleSelectTable", sqlConn);
SqlDataAdapter sqladr = new SqlDataAdapter(sqlCmd);
try
{
sqlConn.ConnectionString = WindowsFormsApplication1.Common.SystemClass.strSqlConnection;

sqlCmd.Parameters.Add("@OrderbyCols", SqlDbType.NVarChar, 100);
sqlCmd.Parameters["@OrderbyCols"].Value = strOrderbyCols;

sqlCmd.Parameters.Add("@SortType", SqlDbType.NVarChar, 10);
if (iSortType == 0)//0表示降序
{
sqlCmd.Parameters["@SortType"].Value = " desc ";
}
else//1表示升序
{
sqlCmd.Parameters["@SortType"].Value = " asc ";
}

sqlCmd.Parameters.Add("@PageSize", SqlDbType.Int);
sqlCmd.Parameters["@PageSize"].Value = iPageSize;

sqlCmd.Parameters.Add("@PageIndex", SqlDbType.Int);
sqlCmd.Parameters["@PageIndex"].Value = iPageIndex;

sqlCmd.Parameters.Add("@PagesNum", SqlDbType.Int);
sqlCmd.Parameters["@PagesNum"].Direction = ParameterDirection.Output;

sqlCmd.Parameters.Add("@SizeMode", SqlDbType.Int);
sqlCmd.Parameters["@SizeMode"].Direction = ParameterDirection.Output;

sqlCmd.Parameters.Add("@TotalRowsCount", SqlDbType.Int);
sqlCmd.Parameters["@TotalRowsCount"].Direction = ParameterDirection.Output;

sqlCmd.CommandType = CommandType.StoredProcedure;

if (sqlConn.State == ConnectionState.Closed)
{
sqlConn.Open();
}

sqladr.Fill(dt);
iPagesNum = Convert.ToInt32(sqlCmd.Parameters["@PagesNum"].Value);
iSizeMode = Convert.ToInt32(sqlCmd.Parameters["@SizeMode"].Value);
iTotalRowsCount = Convert.ToInt32(sqlCmd.Parameters["@TotalRowsCount"].Value);
}
catch (Exception exc)
{
strErrorMessage = exc.Message;
}
finally
{
if (sqlConn.State == ConnectionState.Open)
{
sqlConn.Close();
}
sqladr.Dispose();
sqlCmd.Dispose();
}
return dt;
}
woaijiaojiao1314 2011-06-02
  • 打赏
  • 举报
回复

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[SY_RoleSelectPage]

@RoleID int,
@OrderfldName varchar(255), -- 排序字段名
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@PageSize int, -- 页尺寸
@PageIndex int, -- 页码
@IsCount bit = 0 -- 返回记录总数, 非 0 值则返回
AS
declare @StSql nvarchar(2000)
declare @StSqlWhere nvarchar(1000)

set @StSql = ''
set @StSqlWhere = ''
if @RoleID != 0
begin
set @StSqlWhere = @StSqlWhere + ' and RoleID = ' + cast(@RoleID as nvarchar(10))
end
set @StSql = 'select * from Role'+ @StSqlWhere
if @StSqlWhere !=''
begin
set @StSqlWhere = ' where ' + substring(@StSqlWhere,6, len(@StSqlWhere) - 5)
end
set @StSql = 'select * from Role' + @StSqlWhere

set @StSql = @StSql + ' order by ' + @OrderfldName
if @OrderType = 0
begin
set @StSql = @StSql + ' desc '
end

CREATE TABLE #Role(
[OrderID] [int] IDENTITY(1,1) NOT NULL,
[RoleID] [int],
[RoleName] [nvarchar](50) NOT NULL,
[RoleRemark] [nvarchar](200) NOT NULL,
)

set @StSql = 'insert into #Role' + @StSql
set @IsCount = (select COUNT(*) from #Role)
set @StSql = 'select * from #Role where OrderID >10 and <=20'
print @StSqlWhere
print @StSql
exec(@StSql)
woaijiaojiao1314 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoyi3317 的回复:]
分页,这玩意儿,感觉等你学完ssh后一整合,发现也就两句话。。我郁闷了。。
一句是设置它的起始索引,一句是设置它每页的最大数。。
这个存储过程没试过,祝楼主好运吧
[/Quote]
你用过存储过程吗、ssh?你做过开发吗? 知道什么是项目吗、?
有些问题不懂就不要发言。/
别JB不懂装懂。分页谁不会? 有存储过程进行分就不一样了, bs你
whjk1234bo 2010-07-30
  • 打赏
  • 举报
回复
顶顶更健康!!
happy664618843 2010-01-17
  • 打赏
  • 举报
回复
这个有点复杂帮顶
xiaoyi3317 2009-12-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gz116 的回复:]
引用 2 楼 xiaoyi3317 的回复:
分页,这玩意儿,感觉等你学完ssh后一整合,发现也就两句话。。我郁闷了。。
一句是设置它的起始索引,一句是设置它每页的最大数。。
这个存储过程没试过,祝楼主好运吧


不知道你说的ssh是不是指strut spring hibernate?
hibernate自带的分页功能非常垃圾,只能用在小项目上
我在sqlserver2005上测试 效果非常差
hibernate 生成的sql语句是select top(查询的数量+开始数量)* from 表面
查询得到的datatable然后再截取 效率非常慢

而且这个项目是用在c#上调用....
[/Quote]

这个没测过,我用的是oracle,感觉还可以。。
这个效率慢,的确是一方面。。除非不用框架。。框架也只是为了方便而已,在保存这方面的hibernate的效率感觉还是不错的
gz116 2009-12-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yuanbaishan2 的回复:]
引用 1 楼 jxyxhz 的回复:



1楼的那位 你的红星基本都是告诉LZ 去百度、google 我都看到好几次了。。。。。

LZ去51aspx上面 有好多分页的 这个看着都麻烦
[/Quote]
主要是用在百万级数据库上 如果简单的自己一样可以写 而且一条sql语句就可以搞定了啊
yuanbaishan2 2009-12-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jxyxhz 的回复:]
1.首先知道怎么调用存储过程。

2.继续Google或百度吧,很多的,把握好关键词

3.祝楼主好运
[/Quote]

1楼的那位 你的红星基本都是告诉LZ 去百度、google 我都看到好几次了。。。。。

LZ去51aspx上面 有好多分页的 这个看着都麻烦
zhengweitao 2009-12-04
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
telankes2000 2009-12-04
  • 打赏
  • 举报
回复
这个存储过程有很多错误,建议换别的
dai_oath 2009-12-04
  • 打赏
  • 举报
回复
如果你的主键为连续的identity 使用它效率会非常高。
就是太局限了。
dai_oath 2009-12-04
  • 打赏
  • 举报
回复


/*调用方法*/
USE [Test]
GO

DECLARE @return_value int,
@pageCount int,
@Counts int

EXEC @return_value = [dbo].[ListPage]
@tblName = N'TT',
@fldName = N'ID,a,b ',
@pageSize = 10,
@page = 4,
@pageCount = @pageCount OUTPUT,
@Counts = @Counts OUTPUT,
@fldSort = N'ID',
@Sort = 1,

@ID = N'ID'

SELECT @pageCount as N'@pageCount',
@Counts as N'@Counts'

SELECT 'Return Value' = @return_value

GO

生成的SQL语句
select ID,a,b From TT where ID between 22 and 31 Order by ID DESC
不知道是谁写的,这个存储过程只适合主键为连续值的。其它都不可以。

还有错的地方

set @sqlTmp = + @fldName + 'From ' + @tblName + ' where ' + @strCondition
set @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblName + ' where ' + @strCondition
set @strID = ' From ' + @tblName + ' where ' + @strCondition

@ID +' (between ' + str(@BeginID) + ' and ' + str(@EndID) + ')

建议不行再换个。。

gz116 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyq11 的回复:]
参考
[/Quote]

非常不错的 存不过储过程没有仔细折磨
不知道能否胜任 百万级数据?
gz116 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoyi3317 的回复:]
分页,这玩意儿,感觉等你学完ssh后一整合,发现也就两句话。。我郁闷了。。
一句是设置它的起始索引,一句是设置它每页的最大数。。
这个存储过程没试过,祝楼主好运吧
[/Quote]

不知道你说的ssh是不是指strut spring hibernate?
hibernate自带的分页功能非常垃圾,只能用在小项目上
我在sqlserver2005上测试 效果非常差
hibernate 生成的sql语句是select top(查询的数量+开始数量)* from 表面
查询得到的datatable然后再截取 效率非常慢

而且这个项目是用在c#上调用....
wuyq11 2009-12-04
  • 打赏
  • 举报
回复
wuyq11 2009-12-04
  • 打赏
  • 举报
回复
using (SqlConnection sqlCon = new SqlConnection(""))
{
sqlCon.Open();
sqlComm = new SqlCommand("", sqlCon);
sqlComm.CommandType = CommandType.StoredProcedure;

sqlComm.Parameters.Add("@tblName ", SqlDbType.VarChar,200);
sqlComm.Parameters.Add("@fldName ", SqlDbType.VarChar, 200);
sqlComm.Parameters.Add("@pageCountint ", SqlDbType.int);
...
sqlComm.Parameters["@pageCountint "].Direction = ParameterDirection.Output;
sqlComm.Parameters["@tblName "].Value = "";
sqlComm.Parameters["@fldName "].Value = "";
...
sqlComm.ExecuteNonQuery();
strng c= sqlComm.Parameters["@pageCountint "].Value.ToString();
}
xiaoyi3317 2009-12-04
  • 打赏
  • 举报
回复
分页,这玩意儿,感觉等你学完ssh后一整合,发现也就两句话。。我郁闷了。。
一句是设置它的起始索引,一句是设置它每页的最大数。。
这个存储过程没试过,祝楼主好运吧
小_虎 2009-12-04
  • 打赏
  • 举报
回复
1.首先知道怎么调用存储过程。

2.继续Google或百度吧,很多的,把握好关键词

3.祝楼主好运

62,051

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧