sqlserver存储过程分页代码
2023-06-13 09:14:19 时间
declare@TotalCountint
declare@TotalPageCountint
execP_viewPage_A"type1","*","id","","idasc",1,0,4,3,@TotalCountoutput,@TotalPageCountoutput
select*fromtype1
CreatePROCP_viewPage_A
/*
nzperfect[no_mIss]高效通用分页存储过程(双向检索)2007.5.7QQ:34813284
敬告:适用于单一主键或存在唯一值列的表或视图
ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围
*/
@TableNameVARCHAR(200),--表名
@FieldListVARCHAR(2000),--显示列名,如果是全部字段则为*
@PrimaryKeyVARCHAR(100),--单一主键或唯一值键
@WhereVARCHAR(2000),--查询条件不含"where"字符,如id>10andlen(userid)>9
@OrderVARCHAR(1000),--排序不含"orderby"字符,如idasc,useriddesc,必须指定asc或desc
--注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷
@SortTypeINT,--排序规则1:正序asc2:倒序desc3:多列排序方法
@RecorderCountINT,--记录总数0:会返回总记录
@PageSizeINT,--每页输出的记录数
@PageIndexINT,--当前页数
@TotalCountINTOUTPUT,--记返回总记录
@TotalPageCountINTOUTPUT--返回总页数
AS
SETNOCOUNTON
IFISNULL(@TotalCount,"")=""SET@TotalCount=0
SET@Order=RTRIM(LTRIM(@Order))
SET@PrimaryKey=RTRIM(LTRIM(@PrimaryKey))
SET@FieldList=REPLACE(RTRIM(LTRIM(@FieldList)),"","")
WHILECHARINDEX(",",@Order)>0ORCHARINDEX(",",@Order)>0
BEGIN
SET@Order=REPLACE(@Order,",",",")
SET@Order=REPLACE(@Order,",",",")
END
IFISNULL(@TableName,"")=""ORISNULL(@FieldList,"")=""
ORISNULL(@PrimaryKey,"")=""
OR@SortType<1OR@SortType>3
OR@RecorderCount<0OR@PageSize<0OR@PageIndex<0
BEGIN
PRINT("ERR_00")
RETURN
END
IF@SortType=3
BEGIN
IF(UPPER(RIGHT(@Order,4))!="ASC"ANDUPPER(RIGHT(@Order,5))!="DESC")
BEGINPRINT("ERR_02")RETURNEND
END
DECLARE@new_where1VARCHAR(1000)
DECLARE@new_where2VARCHAR(1000)
DECLARE@new_order1VARCHAR(1000)
DECLARE@new_order2VARCHAR(1000)
DECLARE@new_order3VARCHAR(1000)
DECLARE@SqlVARCHAR(8000)
DECLARE@SqlCountNVARCHAR(4000)
IFISNULL(@where,"")=""
BEGIN
SET@new_where1=""
SET@new_where2="WHERE"
END
ELSE
BEGIN
SET@new_where1="WHERE"+@where
SET@new_where2="WHERE"+@where+"AND"
END
IFISNULL(@order,"")=""OR@SortType=1OR@SortType=2
BEGIN
IF@SortType=1
BEGIN
SET@new_order1="ORDERBY"+@PrimaryKey+"ASC"
SET@new_order2="ORDERBY"+@PrimaryKey+"DESC"
END
IF@SortType=2
BEGIN
SET@new_order1="ORDERBY"+@PrimaryKey+"DESC"
SET@new_order2="ORDERBY"+@PrimaryKey+"ASC"
END
END
ELSE
BEGIN
SET@new_order1="ORDERBY"+@Order
END
IF@SortType=3ANDCHARINDEX(","+@PrimaryKey+"",","+@Order)>0
BEGIN
SET@new_order1="ORDERBY"+@Order
SET@new_order2=@Order+","
SET@new_order2=REPLACE(REPLACE(@new_order2,"ASC,","{ASC},"),"DESC,","{DESC},")
SET@new_order2=REPLACE(REPLACE(@new_order2,"{ASC},","DESC,"),"{DESC},","ASC,")
SET@new_order2="ORDERBY"+SUBSTRING(@new_order2,1,LEN(@new_order2)-1)
IF@FieldList<>"*"
BEGIN
SET@new_order3=REPLACE(REPLACE(@Order+",","ASC,",","),"DESC,",",")
SET@FieldList=","+@FieldList
WHILECHARINDEX(",",@new_order3)>0
BEGIN
IFCHARINDEX(SUBSTRING(","+@new_order3,1,CHARINDEX(",",@new_order3)),","+@FieldList+",")>0
BEGIN
SET@FieldList=
@FieldList+","+SUBSTRING(@new_order3,1,CHARINDEX(",",@new_order3))
END
SET@new_order3=
SUBSTRING(@new_order3,CHARINDEX(",",@new_order3)+1,LEN(@new_order3))
END
SET@FieldList=SUBSTRING(@FieldList,2,LEN(@FieldList))
END
END
SET@SqlCount="SELECT@TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/"
+CAST(@PageSizeASVARCHAR)+")FROM"+@TableName+@new_where1
IF@RecorderCount=0
BEGIN
EXECSP_EXECUTESQL@SqlCount,N"@TotalCountINTOUTPUT,@TotalPageCountINTOUTPUT",
@TotalCountOUTPUT,@TotalPageCountOUTPUT
END
ELSE
BEGIN
SELECT@TotalCount=@RecorderCount
END
IF@PageIndex>CEILING((@TotalCount+0.0)/@PageSize)
BEGIN
SET@PageIndex=CEILING((@TotalCount+0.0)/@PageSize)
END
IF@PageIndex=1OR@PageIndex>=CEILING((@TotalCount+0.0)/@PageSize)
BEGIN
IF@PageIndex=1--返回第一页数据
BEGIN
SET@Sql="SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM"
+@TableName+@new_where1+@new_order1
END
IF@PageIndex>=CEILING((@TotalCount+0.0)/@PageSize)--返回最后一页数据
BEGIN
SET@Sql="SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM("
+"SELECTTOP"+STR(ABS(@PageSize*@PageIndex-@TotalCount-@PageSize))
+""+@FieldList+"FROM"
+@TableName+@new_where1+@new_order2+")ASTMP"
+@new_order1
END
END
ELSE
BEGIN
IF@SortType=1--仅主键正序排序
BEGIN
IF@PageIndex<=CEILING((@TotalCount+0.0)/@PageSize)/2--正向检索
BEGIN
SET@Sql="SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM"
+@TableName+@new_where2+@PrimaryKey+">"
+"(SELECTMAX("+@PrimaryKey+")FROM(SELECTTOP"
+STR(@PageSize*(@PageIndex-1))+""+@PrimaryKey
+"FROM"+@TableName
+@new_where1+@new_order1+")ASTMP)"+@new_order1
END
ELSE--反向检索
BEGIN
SET@Sql="SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM("
+"SELECTTOP"+STR(@PageSize)+""
+@FieldList+"FROM"
+@TableName+@new_where2+@PrimaryKey+"<"
+"(SELECTMIN("+@PrimaryKey+")FROM(SELECTTOP"
+STR(@TotalCount-@PageSize*@PageIndex)+""+@PrimaryKey
+"FROM"+@TableName
+@new_where1+@new_order2+")ASTMP)"+@new_order2
+")ASTMP"+@new_order1
END
END
IF@SortType=2--仅主键反序排序
BEGIN
IF@PageIndex<=CEILING((@TotalCount+0.0)/@PageSize)/2--正向检索
BEGIN
SET@Sql="SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM"
+@TableName+@new_where2+@PrimaryKey+"<"
+"(SELECTMIN("+@PrimaryKey+")FROM(SELECTTOP"
+STR(@PageSize*(@PageIndex-1))+""+@PrimaryKey
+"FROM"+@TableName
+@new_where1+@new_order1+")ASTMP)"+@new_order1
END
ELSE--反向检索
BEGIN
SET@Sql="SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM("
+"SELECTTOP"+STR(@PageSize)+""
+@FieldList+"FROM"
+@TableName+@new_where2+@PrimaryKey+">"
+"(SELECTMAX("+@PrimaryKey+")FROM(SELECTTOP"
+STR(@TotalCount-@PageSize*@PageIndex)+""+@PrimaryKey
+"FROM"+@TableName
+@new_where1+@new_order2+")ASTMP)"+@new_order2
+")ASTMP"+@new_order1
END
END
IF@SortType=3--多列排序,必须包含主键,且放置最后,否则不处理
BEGIN
IFCHARINDEX(","+@PrimaryKey+"",","+@Order)=0
BEGINPRINT("ERR_02")RETURNEND
IF@PageIndex<=CEILING((@TotalCount+0.0)/@PageSize)/2--正向检索
BEGIN
SET@Sql="SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM("
+"SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM("
+"SELECTTOP"+STR(@PageSize*@PageIndex)+""+@FieldList
+"FROM"+@TableName+@new_where1+@new_order1+")ASTMP"
+@new_order2+")ASTMP"+@new_order1
END
ELSE--反向检索
BEGIN
SET@Sql="SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM("
+"SELECTTOP"+STR(@PageSize)+""+@FieldList+"FROM("
+"SELECTTOP"+STR(@TotalCount-@PageSize*@PageIndex+@PageSize)+""+@FieldList
+"FROM"+@TableName+@new_where1+@new_order2+")ASTMP"
+@new_order1+")ASTMP"+@new_order1
END
END
END
EXEC(@Sql)
GO
如何用vc#调用上面的存储过程
privatevoidfyDB()
{
DataTabledt=newDataTable();
stringcon=System.Configuration.ConfigurationSettings.AppSettings["connectionstring"];
SqlConnectionconn=newSqlConnection(con);
SqlCommandcomm=newSqlCommand("P_viewPage_A",conn);//建立SqlCommand对象
comm.CommandType=CommandType.StoredProcedure;//设置SqlCommand对象执行类型为存储过程
comm.Parameters.Add("@TableName",SqlDbType.VarChar,200);//向Parameters参数列表添加参数
comm.Parameters.Add("@FieldList",SqlDbType.VarChar,2000);
comm.Parameters.Add("@PrimaryKey",SqlDbType.VarChar,100);
comm.Parameters.Add("@where",SqlDbType.VarChar,2000);
comm.Parameters.Add("@Order",SqlDbType.VarChar,1000);
comm.Parameters.Add("@SortType",SqlDbType.Int);
comm.Parameters.Add("@RecorderCount",SqlDbType.Int);
comm.Parameters.Add("@PageSize",SqlDbType.Int);
comm.Parameters.Add("@PageIndex",SqlDbType.Int);
comm.Parameters.Add("@TotalCount",SqlDbType.Int);
comm.Parameters.Add("@TotalPageCount",SqlDbType.Int);
comm.Parameters["@TotalCount"].Direction=ParameterDirection.Output;//设置参数的输出类型
comm.Parameters["@TotalPageCount"].Direction=ParameterDirection.Output;//设置参数的输出类型
comm.Parameters["@TableName"].Value="type1";//表名
comm.Parameters["@FieldList"].Value="*";//显示列名,如果是全部字段则为*
comm.Parameters["@PrimaryKey"].Value="id";//单一主键或唯一值键
comm.Parameters["@where"].Value="";//查询条件不含"where"字符,如id>10andlen(userid)>9
comm.Parameters["@Order"].Value="idasc";//排序不含"orderby"字符,如idasc,useriddesc,必须指定asc或desc
comm.Parameters["@SortType"].Value=1;//排序规则1:正序asc2:倒序desc3:多列排序方法
comm.Parameters["@RecorderCount"].Value=0;//记录总数0:会返回总记录
comm.Parameters["@PageSize"].Value=2;//每页输出的记录数
intid1;
if(Request.QueryString["id"]==null)
id1=1;
else
id1=Convert.ToInt32(Request.QueryString["id"]);
comm.Parameters["@PageIndex"].Value=id1;//当前页数
conn.Open();
//SqlDataReaderasr=comm.ExecuteReader();
//intdtr=(int)comm.ExecuteScalar();
SqlDataReadersdr=comm.ExecuteReader();
inti=0;
//while(sdr.Read())
//{
//dt.Rows[i][0]=sdr.GetValue(0);
//dt.Rows[i][1]=sdr.GetValue(1);
//}
dt=ConvertDataReaderToDataTable(sdr);
GridView1.DataSource=dt;
GridView1.DataBind();
//dt.Rows[0][0];
sdr.Close();
//Response.Write(dtr);
Response.Write(comm.Parameters["@TotalCount"].Value+"<br>");
Response.Write(comm.Parameters["@TotalPageCount"].Value+"<br>");
//if((Int32)comm.Parameters["RETURN_VALUE"].Value==0)
conn.Close();
//stringconStr=System.Configuration.ConfigurationSettings.AppSettings["connectionstring"];
//SqlConnectionconnection=newSqlConnection(conStr);
//DataSetdataSet=newDataSet();
//connection.Open();
//SqlDataAdaptersqlDA=newSqlDataAdapter();
//sqlDA.SelectCommand=BuildQueryCommand(connection,"P_viewPage_A",parameters);
//sqlDA.Fill(dataSet,tableName);
//connection.Close();
//returndataSet;
}
#region将DataReader转为DataTable
///<summary>
///将DataReader转为DataTable
///</summary>
///<paramname="DataReader">DataReader</param>
publicstaticDataTableConvertDataReaderToDataTable(SqlDataReaderreader)
{
try
{
DataTableobjDataTable=newDataTable();
intintFieldCount=reader.FieldCount;
for(intintCounter=0;intCounter<intFieldCount;++intCounter)
{
objDataTable.Columns.Add(reader.GetName(intCounter),reader.GetFieldType(intCounter));
}
objDataTable.BeginLoadData();
object[]objValues=newobject[intFieldCount];
while(reader.Read())
{
reader.GetValues(objValues);
objDataTable.LoadDataRow(objValues,true);
}
reader.Close();
objDataTable.EndLoadData();
returnobjDataTable;
}
catch(Exceptionex)
{
thrownewException("转换DataReader为DataTable出错!",ex);
}
}
#endregion
相关文章
- SQLServer 错误 556 由于存储过程改变了目标表的架构,INSERT EXEC 失败。 故障 处理 修复 支持远程
- 关闭SQLServer:正确的停止方式(关闭sqlserver)
- 简单即用:用网页版SQL Server维持数据库状态(网页版sqlserver)
- 使用SQLServer创建数据库表格(用sqlserver建表)
- 销毁SQLServer死锁:一场可怕又激烈的斗争(杀sqlserver死锁)
- 保护数据:加密SqlServer数据库的新方法(加密sqlserver)
- 分布式SqlServer:改变数据存储方式的新动力(分布式sqlserver)
- 架构未来:实现云端SQLServer智能运维(云端sqlserver)
- SQL Server长整型数据类型及其应用(sqlserver长整形)
- 使用SQLServer电子版轻松解决数据存储问题(sqlserver电子版)
- 行使用SqlServer命令行管理数据库(sqlserver用命令)
- 清理SQLServer缓存的技巧及注意事项(sqlserver清缓存)
- SQLServer显示出超凡价值(sqlserver显式值)
- 如何学习使用SQLServer?(sqlserver怎么念)
- SQL Server 开启数据库之旅(sqlserver 开窗)
- 备份SQL Server定时备份:保障数据安全(sqlserver 定时)
- 约束SQLServer中唯一性约束的作用与意义(sqlserver唯一性)
- SQLServer数据库完美合集(sqlserver 合集)
- 掌握SQLServer列信息,做到更好的数据处理(sqlserver列信息)
- 利用SQLServer写出代码的技巧(sqlserver写代码)
- SQL Server进程关闭实践(sqlserver关进程)
- SQLServer中的子类概述(sqlserver中子类)
- 的使用掌握SQLServer函数,助力数据处理实力(sqlserver中函数)
- is基于SQLServer和IIS的网络建设方案(sqlserver i)
- SQLServer参数化查询经验分享
- sqlserver千万数量级分页存储过程代码
- SQLserver数据库危险存储过程删除与恢复方法
- C#操作图片读取和存储SQLserver实现代码