set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ------ 海量数据库分页存储过程 ------ --参数列表: --@tblName -- 表名(必添); --@pkid --主键 --@strGetFields -- 需要返回的列(默认所有列); --@fldName -- 排序的字段名(必添); --@PageSize -- 页尺寸(默认每页10条); --@PageIndex -- 页码(默认第1页); --@doCount -- 返回记录总数,非"0"值则返回(用处不大); --@OrderType -- 设置排序类型,非"0"值则降序(默认正序); --@strWhere -- 查询条件(警告:不需要加 where); --调用示例:exec PageShow TEST,ID,"*" order ,20,1,0,1,"name='DF'"--调用示例: --exec PageShow -- @tblName="表名", -- @pkid="主键", -- @strGetFields="需要返回的列(默认所有列)", -- @fldName="排序的字段名", -- @PageSize=页尺寸(默认每页10条), -- @PageIndex=页码(默认第1页), -- @doCount=返回记录总数,非"0"值则返回(用处不大), -- @OrderType=设置排序类型,非"0"值则降序(默认正序), -- @strWhere="查询条件(警告:不需要加 where)例如StuSex='男'" --------------------------------------------------------- ALTER PROCEDURE [dbo].[PageShow] @doCount int= 0 , @tblName varchar(255), @strWhere varchar(1500) = '', @pkid varchar(50) = '*', @strGetFields varchar(1000) = '*', @fldName varchar(255)='', @OrderType int = 0, @PageSize int = 10, @PageIndex int = 1AS declare @strSQL varchar(5000) -- 主语句 declare @strTmp varchar(110) -- 临时变量 declare @strOrder varchar(400) -- 排序类型begin tran if @doCount != 0 begin if @strWhere !='' begin set @strSQL = 'select count(['+@pkid+']) as Total from ['+ @tblName +'] where '+@strWhere end else begin set @strSQL = 'select count(['+@pkid+']) as Total from [' + @tblName + ']' end print @Strsql end --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况 else begin if @OrderType != 0 begin set @strOrder = ' order by ' + @fldName +' desc' --如果@OrderType不是0,就执行降序,这句很重要! end else begin set @strOrder = ' order by ' + @fldName +' asc' end set @strSQL = 'select '+ @strGetFields+ 'from ( select *,(row_number() over('+@strOrder +')-1)/'+cast(@PageSize as varchar)+' as rownum from ' + @tblName +' where ' +@strWhere +') TblTemp where rownum = '+cast(@PageIndex -1 as varchar) end --print @strSQL exec (@strSQL) if @@error<>0 rollback else commit tran谢谢 小当家 这是小当家帮改的 贴出来大家参考
--AS declare @strSQL varchar(5000) ='' -- 主语句 declare @strTmp varchar(110) ='' -- 临时变量 declare @strOrder varchar(400) =''-- 排序类型 下面是测试出来的SQL语句 select top 10 * from [tt] where [od]<(select min([od]) from (select top 10 [od]from [tt] order by [od] desc) as tblTmp) order by [od] desc 你们觉得这个语句能执行成功吗?
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'这句我不明白你select min是什么意图。
没有给查询结果的列取别名
@strTmp + '(['+ @fldName + ']) from (select top ' 改成
@strTmp + '(['+ @fldName + ']) '+@fldName +'from (select top '
后面如果还有中间结果集的话也加上别名
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
------ 海量数据库分页存储过程 ------
--参数列表:
--@tblName -- 表名(必添);
--@pkid --主键
--@strGetFields -- 需要返回的列(默认所有列);
--@fldName -- 排序的字段名(必添);
--@PageSize -- 页尺寸(默认每页10条);
--@PageIndex -- 页码(默认第1页);
--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
--@strWhere -- 查询条件(警告:不需要加 where);
--调用示例:exec PageShow TEST,ID,"*" order ,20,1,0,1,"name='DF'"--调用示例:
--exec PageShow
-- @tblName="表名",
-- @pkid="主键",
-- @strGetFields="需要返回的列(默认所有列)",
-- @fldName="排序的字段名",
-- @PageSize=页尺寸(默认每页10条),
-- @PageIndex=页码(默认第1页),
-- @doCount=返回记录总数,非"0"值则返回(用处不大),
-- @OrderType=设置排序类型,非"0"值则降序(默认正序),
-- @strWhere="查询条件(警告:不需要加 where)例如StuSex='男'"
---------------------------------------------------------
ALTER PROCEDURE [dbo].[PageShow]
@doCount int= 0 ,
@tblName varchar(255),
@strWhere varchar(1500) = '',
@pkid varchar(50) = '*',
@strGetFields varchar(1000) = '*',
@fldName varchar(255)='',
@OrderType int = 0,
@PageSize int = 10,
@PageIndex int = 1AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型begin tran
if @doCount != 0
begin
if @strWhere !=''
begin
set @strSQL = 'select count(['+@pkid+']) as Total from ['+ @tblName +'] where '+@strWhere
end
else
begin
set @strSQL = 'select count(['+@pkid+']) as Total from [' + @tblName + ']'
end
print @Strsql
end --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
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
print @strSQL
--exec (@strSQL)
if @@error<>0
rollback
else
commit tran
把存储过程中的这个:--print @strSQL
exec (@strSQL)改为
print @strSQL
--exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看
把存储过程中的这个:--print @strSQL
exec (@strSQL)改为
print @strSQL
--exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看/// <summary>
/// 获取信息条数
/// </summary>
/// <param name="pager">条件</param>
/// <returns></returns>
public int GetUnitListCount(PagerCondition pager)
{
//--参数列表:
//--@tblName -- 表名(必添);
//--@pkid --主键
//--@strGetFields -- 需要返回的列(默认所有列);
//--@fldName -- 排序的字段名(必添);
//--@PageSize -- 页尺寸(默认每页10条);
//--@PageIndex -- 页码(默认第1页);
//--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
//--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
//--@strWhere -- 查询条件(警告:不需要加 where);
SqlParameter[] parameters = { new SqlParameter("@tblName", pager.TblName),
new SqlParameter("@pkid",pager.Pkid),
new SqlParameter("@strGetFields",pager.StrGetiFelds),
new SqlParameter("@fldName",pager.FldName),
new SqlParameter("@PageSize",pager.PageSize),
new SqlParameter("@PageIndex",pager.PageIndex),
new SqlParameter("@doCount",1),
new SqlParameter("@OrderType",pager.OrderType),
new SqlParameter("@strWhere",pager.StrWhere)
};
try
{
DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.Connection, CommandType.StoredProcedure, "NewPageShow", parameters); if (ds.Tables[0].Rows.Count > 0)
{
return Convert.ToInt32(ds.Tables[0].Rows[0][0]);
}
else
{
return 0;
} }
catch (Exception)
{ throw;
}
finally
{ }
}报错了撒.....
下面是我引用的
private void BindDataList()
{
//--参数列表:
//--@tblName -- 表名(必添);
//--@pkid --主键
//--@strGetFields -- 需要返回的列(默认所有列);
//--@fldName -- 排序的字段名(必添);
//--@PageSize -- 页尺寸(默认每页10条);
//--@PageIndex -- 页码(默认第1页);
//--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
//--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
//--@strWhere -- 查询条件(警告:不需要加 where);
pager.TblName = "A_001";
pager.Pkid = "OID_A001";
pager.StrGetiFelds = "*";
pager.FldName = "F3_A001 asc,F6_A001";
AspNetPager1.PageSize = 20;
pager.PageSize = AspNetPager1.PageSize;
pager.PageIndex = AspNetPager1.CurrentPageIndex;
pager.DoCount = 0;
pager.OrderType = 0;
pager.StrWhere = " F4_A001='Unit' and F3_A001 in (1,3)" + strQuery;
NewsList.DataSource = dbll.GetUnitList(pager);
AspNetPager1.RecordCount = Convert.ToInt32(dbll.GetUnitListCount(pager));
NewsList.DataBind();
}
把存储过程中的这个:--print @strSQL
exec (@strSQL)改为
print @strSQL
--exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看/// <summary>
/// 获取信息条数
/// </summary>
/// <param name="pager">条件</param>
/// <returns></returns>
public int GetUnitListCount(PagerCondition pager)
{
//--参数列表:
//--@tblName -- 表名(必添);
//--@pkid --主键
//--@strGetFields -- 需要返回的列(默认所有列);
//--@fldName -- 排序的字段名(必添);
//--@PageSize -- 页尺寸(默认每页10条);
//--@PageIndex -- 页码(默认第1页);
//--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
//--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
//--@strWhere -- 查询条件(警告:不需要加 where);
SqlParameter[] parameters = { new SqlParameter("@tblName", pager.TblName),
new SqlParameter("@pkid",pager.Pkid),
new SqlParameter("@strGetFields",pager.StrGetiFelds),
new SqlParameter("@fldName",pager.FldName),
new SqlParameter("@PageSize",pager.PageSize),
new SqlParameter("@PageIndex",pager.PageIndex),
new SqlParameter("@doCount",1),
new SqlParameter("@OrderType",pager.OrderType),
new SqlParameter("@strWhere",pager.StrWhere)
};
try
{
DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.Connection, CommandType.StoredProcedure, "NewPageShow", parameters); if (ds.Tables[0].Rows.Count > 0)
{
return Convert.ToInt32(ds.Tables[0].Rows[0][0]);
}
else
{
return 0;
} }
catch (Exception)
{ throw;
}
finally
{ }
}报错了撒.....
下面是我引用的
private void BindDataList()
{
//--参数列表:
//--@tblName -- 表名(必添);
//--@pkid --主键
//--@strGetFields -- 需要返回的列(默认所有列);
//--@fldName -- 排序的字段名(必添);
//--@PageSize -- 页尺寸(默认每页10条);
//--@PageIndex -- 页码(默认第1页);
//--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
//--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
//--@strWhere -- 查询条件(警告:不需要加 where);
pager.TblName = "A_001";
pager.Pkid = "OID_A001";
pager.StrGetiFelds = "*";
pager.FldName = "F3_A001 asc,F6_A001";
AspNetPager1.PageSize = 20;
pager.PageSize = AspNetPager1.PageSize;
pager.PageIndex = AspNetPager1.CurrentPageIndex;
pager.DoCount = 0;
pager.OrderType = 0;
pager.StrWhere = " F4_A001='Unit' and F3_A001 in (1,3)" + strQuery;
NewsList.DataSource = dbll.GetUnitList(pager);
AspNetPager1.RecordCount = Convert.ToInt32(dbll.GetUnitListCount(pager));
NewsList.DataBind();
}我加你了,你也加我关注,可以发私信,帮你看看
把存储过程中的这个:--print @strSQL
exec (@strSQL)改为
print @strSQL
--exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看/// <summary>
/// 获取信息条数
/// </summary>
/// <param name="pager">条件</param>
/// <returns></returns>
public int GetUnitListCount(PagerCondition pager)
{
//--参数列表:
//--@tblName -- 表名(必添);
//--@pkid --主键
//--@strGetFields -- 需要返回的列(默认所有列);
//--@fldName -- 排序的字段名(必添);
//--@PageSize -- 页尺寸(默认每页10条);
//--@PageIndex -- 页码(默认第1页);
//--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
//--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
//--@strWhere -- 查询条件(警告:不需要加 where);
SqlParameter[] parameters = { new SqlParameter("@tblName", pager.TblName),
new SqlParameter("@pkid",pager.Pkid),
new SqlParameter("@strGetFields",pager.StrGetiFelds),
new SqlParameter("@fldName",pager.FldName),
new SqlParameter("@PageSize",pager.PageSize),
new SqlParameter("@PageIndex",pager.PageIndex),
new SqlParameter("@doCount",1),
new SqlParameter("@OrderType",pager.OrderType),
new SqlParameter("@strWhere",pager.StrWhere)
};
try
{
DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.Connection, CommandType.StoredProcedure, "NewPageShow", parameters); if (ds.Tables[0].Rows.Count > 0)
{
return Convert.ToInt32(ds.Tables[0].Rows[0][0]);
}
else
{
return 0;
} }
catch (Exception)
{ throw;
}
finally
{ }
}报错了撒.....
下面是我引用的
private void BindDataList()
{
//--参数列表:
//--@tblName -- 表名(必添);
//--@pkid --主键
//--@strGetFields -- 需要返回的列(默认所有列);
//--@fldName -- 排序的字段名(必添);
//--@PageSize -- 页尺寸(默认每页10条);
//--@PageIndex -- 页码(默认第1页);
//--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
//--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
//--@strWhere -- 查询条件(警告:不需要加 where);
pager.TblName = "A_001";
pager.Pkid = "OID_A001";
pager.StrGetiFelds = "*";
pager.FldName = "F3_A001 asc,F6_A001";
AspNetPager1.PageSize = 20;
pager.PageSize = AspNetPager1.PageSize;
pager.PageIndex = AspNetPager1.CurrentPageIndex;
pager.DoCount = 0;
pager.OrderType = 0;
pager.StrWhere = " F4_A001='Unit' and F3_A001 in (1,3)" + strQuery;
NewsList.DataSource = dbll.GetUnitList(pager);
AspNetPager1.RecordCount = Convert.ToInt32(dbll.GetUnitListCount(pager));
NewsList.DataBind();
}我加你了,你也加我关注,可以发私信,帮你看看我加了发信了,困扰我两天的问题》
把存储过程中的这个:--print @strSQL
exec (@strSQL)改为
print @strSQL
--exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看/// <summary>
/// 获取信息条数
/// </summary>
/// <param name="pager">条件</param>
/// <returns></returns>
public int GetUnitListCount(PagerCondition pager)
{
//--参数列表:
//--@tblName -- 表名(必添);
//--@pkid --主键
//--@strGetFields -- 需要返回的列(默认所有列);
//--@fldName -- 排序的字段名(必添);
//--@PageSize -- 页尺寸(默认每页10条);
//--@PageIndex -- 页码(默认第1页);
//--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
//--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
//--@strWhere -- 查询条件(警告:不需要加 where);
SqlParameter[] parameters = { new SqlParameter("@tblName", pager.TblName),
new SqlParameter("@pkid",pager.Pkid),
new SqlParameter("@strGetFields",pager.StrGetiFelds),
new SqlParameter("@fldName",pager.FldName),
new SqlParameter("@PageSize",pager.PageSize),
new SqlParameter("@PageIndex",pager.PageIndex),
new SqlParameter("@doCount",1),
new SqlParameter("@OrderType",pager.OrderType),
new SqlParameter("@strWhere",pager.StrWhere)
};
try
{
DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.Connection, CommandType.StoredProcedure, "NewPageShow", parameters); if (ds.Tables[0].Rows.Count > 0)
{
return Convert.ToInt32(ds.Tables[0].Rows[0][0]);
}
else
{
return 0;
} }
catch (Exception)
{ throw;
}
finally
{ }
}报错了撒.....
下面是我引用的
private void BindDataList()
{
//--参数列表:
//--@tblName -- 表名(必添);
//--@pkid --主键
//--@strGetFields -- 需要返回的列(默认所有列);
//--@fldName -- 排序的字段名(必添);
//--@PageSize -- 页尺寸(默认每页10条);
//--@PageIndex -- 页码(默认第1页);
//--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
//--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
//--@strWhere -- 查询条件(警告:不需要加 where);
pager.TblName = "A_001";
pager.Pkid = "OID_A001";
pager.StrGetiFelds = "*";
pager.FldName = "F3_A001 asc,F6_A001";
AspNetPager1.PageSize = 20;
pager.PageSize = AspNetPager1.PageSize;
pager.PageIndex = AspNetPager1.CurrentPageIndex;
pager.DoCount = 0;
pager.OrderType = 0;
pager.StrWhere = " F4_A001='Unit' and F3_A001 in (1,3)" + strQuery;
NewsList.DataSource = dbll.GetUnitList(pager);
AspNetPager1.RecordCount = Convert.ToInt32(dbll.GetUnitListCount(pager));
NewsList.DataBind();
}我加你了,你也加我关注,可以发私信,帮你看看我给你发私信了
set QUOTED_IDENTIFIER ON
go
------ 海量数据库分页存储过程 ------
--参数列表:
--@tblName -- 表名(必添);
--@pkid --主键
--@strGetFields -- 需要返回的列(默认所有列);
--@fldName -- 排序的字段名(必添);
--@PageSize -- 页尺寸(默认每页10条);
--@PageIndex -- 页码(默认第1页);
--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
--@strWhere -- 查询条件(警告:不需要加 where);
--调用示例:exec PageShow TEST,ID,"*" order ,20,1,0,1,"name='DF'"--调用示例:
--exec PageShow
-- @tblName="表名",
-- @pkid="主键",
-- @strGetFields="需要返回的列(默认所有列)",
-- @fldName="排序的字段名",
-- @PageSize=页尺寸(默认每页10条),
-- @PageIndex=页码(默认第1页),
-- @doCount=返回记录总数,非"0"值则返回(用处不大),
-- @OrderType=设置排序类型,非"0"值则降序(默认正序),
-- @strWhere="查询条件(警告:不需要加 where)例如StuSex='男'"
---------------------------------------------------------
ALTER PROCEDURE [dbo].[PageShow]
@doCount int= 0 ,
@tblName varchar(255),
@strWhere varchar(1500) = '',
@pkid varchar(50) = '*',
@strGetFields varchar(1000) = '*',
@fldName varchar(255)='',
@OrderType int = 0,
@PageSize int = 10,
@PageIndex int = 1AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型begin tran
if @doCount != 0
begin
if @strWhere !=''
begin
set @strSQL = 'select count(['+@pkid+']) as Total from ['+ @tblName +'] where '+@strWhere
end
else
begin
set @strSQL = 'select count(['+@pkid+']) as Total from [' + @tblName + ']'
end
print @Strsql
end --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
else
begin
if @OrderType != 0
begin
set @strOrder = ' order by ' + @fldName +' desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strOrder = ' order by ' + @fldName +' asc'
end
set @strSQL =
'select '+ @strGetFields+
'from
(
select *,(row_number() over('+@strOrder +')-1)/'+cast(@PageSize as varchar)+' as rownum from ' + @tblName +' where '
+@strWhere +') TblTemp where rownum = '+cast(@PageIndex -1 as varchar)
end
--print @strSQL
exec (@strSQL)
if @@error<>0
rollback
else
commit tran谢谢 小当家 这是小当家帮改的 贴出来大家参考
@tblName varchar(255) ='tt',
@strWhere varchar(1500) = '',
@pkid varchar(50) = '*',
@strGetFields varchar(1000) = '*',
@fldName varchar(255)='od',
@OrderType int = 1,
@PageSize int = 10,
@PageIndex int = 2
--AS
declare @strSQL varchar(5000) ='' -- 主语句
declare @strTmp varchar(110) ='' -- 临时变量
declare @strOrder varchar(400) =''-- 排序类型
下面是测试出来的SQL语句
select top 10 * from [tt] where [od]<(select min([od]) from (select top 10 [od]from [tt] order by [od] desc) as tblTmp) order by [od] desc
你们觉得这个语句能执行成功吗?