zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

sqlserver存储过程分页代码

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