功能不错的分页存储过程,可支持多表查询,任意排序!
存储过程如下:
/*
说明:1.支持多表查询 2.支持任意排序 3.不支持表别名
IF(EXISTS(Select * FROM sysobjects Where [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))
Drop PROCEDURE usp_PagingLarge
*/GOCreate PROCEDURE usp_PagingLarge
@TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名
@PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空
@Fields VARCHAR(200), --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
@PageSize INT, --每页记录数
@CurrentPage INT, --当前页,0表示第1页
@Filter VARCHAR(200) = '', --条件,可以为空,不用填 where
@Group VARCHAR(200) = '', --分组依据,可以为空,不用填 group by
@Order VARCHAR(200) = '' --排序,可以为空,为空默认按主键升序排列,不用填 order by
AS
BEGIN
DECLARE @SortColumn VARCHAR(200)
DECLARE @Operator CHAR(2)
DECLARE @SortTable VARCHAR(200)
DECLARE @SortName VARCHAR(200)
IF @Fields = ''
SET @Fields = '*'
IF @Filter = ''
SET @Filter = 'Where 1=1'
ELSE
SET @Filter = 'Where ' + @Filter
IF @Group <>''
SET @Group = 'GROUP BY ' + @Group IF @Order <> ''
BEGIN
DECLARE @pos1 INT, @pos2 INT
SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')
IF CHARINDEX(' DESC', @Order) > 0
IF CHARINDEX(' ASC', @Order) > 0
BEGIN
IF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)
SET @Operator = '<='
ELSE
SET @Operator = '>='
END
ELSE
SET @Operator = '<='
ELSE
SET @Operator = '>='
SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')
SET @pos1 = CHARINDEX(',', @SortColumn)
IF @pos1 > 0
SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)
SET @pos2 = CHARINDEX('.', @SortColumn)
IF @pos2 > 0
BEGIN
SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)
IF @pos1 > 0
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)
ELSE
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)
END
ELSE
BEGIN
SET @SortTable = @TableNames
SET @SortName = @SortColumn
END
END
ELSE
BEGIN
SET @SortColumn = @PrimaryKey
SET @SortTable = @TableNames
SET @SortName = @SortColumn
SET @Order = @SortColumn
SET @Operator = '>='
END DECLARE @type varchar(50)
DECLARE @prec int
Select @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
Where o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')' DECLARE @TopRows INT
SET @TopRows = @PageSize * @CurrentPage + 1
print @TopRows
print @Operator
EXEC('
DECLARE @SortColumnBegin ' + @type + '
SET ROWCOUNT ' + @TopRows + '
Select @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' orDER BY ' + @Order + '
SET ROWCOUNT ' + @PageSize + '
Select ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' orDER BY ' + @Order + '
')
ENDGOCS代码如下:
SqlConnection mySqlConnection = new SqlConnection(ConfigurationManager.AppSettings["sqlcon"]);
SqlCommand mySqlCommand = new SqlCommand("usp_PagingLarge", mySqlConnection);
mySqlCommand.CommandType = CommandType.StoredProcedure; SqlParameter workParm; //数据表名
workParm = mySqlCommand.Parameters.Add("@TableNames", SqlDbType.VarChar, 30);
mySqlCommand.Parameters["@TableNames"].Value = "yy960_zs_dlinfo";
//数据表字段,以","号分隔
workParm = mySqlCommand.Parameters.Add("@Fields", SqlDbType.VarChar, 200);
mySqlCommand.Parameters["@Fields"].Value = "id,uid,pdname,area,tj,addtime"; //查询条件,不需where"
workParm = mySqlCommand.Parameters.Add("@Filter", SqlDbType.VarChar, 500);
mySqlCommand.Parameters["@Filter"].Value = ""; //主表的主键,必须为INT类型
workParm = mySqlCommand.Parameters.Add("@PrimaryKey", SqlDbType.VarChar, 150);
mySqlCommand.Parameters["@PrimaryKey"].Value = "id"; //排序字段列表或条件
workParm = mySqlCommand.Parameters.Add("@Order", SqlDbType.VarChar, 50);
mySqlCommand.Parameters["@Order"].Value = "id desc"; //页号
workParm = mySqlCommand.Parameters.Add("@CurrentPage", SqlDbType.Int);
mySqlCommand.Parameters["@CurrentPage"].Value = intPageNo; //每页显示数
workParm = mySqlCommand.Parameters.Add("@PageSize", SqlDbType.Int);
mySqlCommand.Parameters["@PageSize"].Value = intPageSize; //总记录数(存储过程输出参数)
workParm = mySqlCommand.Parameters.Add("@不知道怎么调", SqlDbType.Int);
workParm.Direction = ParameterDirection.Output; //当前页记录数(存储过程返回值)
workParm = mySqlCommand.Parameters.Add("RowCount", SqlDbType.Int);
workParm.Direction = ParameterDirection.ReturnValue; mySqlConnection.Open();
Repeater.DataSource = mySqlCommand.ExecuteReader(); Repeater.DataBind(); mySqlConnection.Close();
Int32 RecordCount = (Int32)mySqlCommand.Parameters["@不知道怎么调"].Value;
Int32 RowCount = (Int32)mySqlCommand.Parameters["RowCount"].Value; LabelRecord.Text = RecordCount.ToString();
LabelRow.Text = intPageNo.ToString();
intPageCount = RecordCount / intPageSize;
if ((RecordCount % intPageSize) > 0)
intPageCount += 1;
LabelPage.Text = intPageCount.ToString(); if (intPageNo > 1)
{
HLFistPage.NavigateUrl = "?CurrentPage=1";
HLPrevPage.NavigateUrl = String.Concat("?CurrentPage=", "", intPageNo - 1);
}
else
{
HLFistPage.NavigateUrl = "";
HLPrevPage.NavigateUrl = "";
} if (intPageNo < intPageCount)
{
HLNextPage.NavigateUrl = String.Concat("?CurrentPage=", "", intPageNo + 1);
HLEndPage.NavigateUrl = String.Concat("?CurrentPage=", "", intPageCount);
}
else
{
HLNextPage.NavigateUrl = "";
HLEndPage.NavigateUrl = "";
}请高手指点一下总记录数那么怎么调,这个分页才能正常运行
存储过程如下:
/*
说明:1.支持多表查询 2.支持任意排序 3.不支持表别名
IF(EXISTS(Select * FROM sysobjects Where [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))
Drop PROCEDURE usp_PagingLarge
*/GOCreate PROCEDURE usp_PagingLarge
@TableNames VARCHAR(200), --表名,可以是多个表,但不能用别名
@PrimaryKey VARCHAR(100), --主键,可以为空,但@Order为空时该值不能为空
@Fields VARCHAR(200), --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
@PageSize INT, --每页记录数
@CurrentPage INT, --当前页,0表示第1页
@Filter VARCHAR(200) = '', --条件,可以为空,不用填 where
@Group VARCHAR(200) = '', --分组依据,可以为空,不用填 group by
@Order VARCHAR(200) = '' --排序,可以为空,为空默认按主键升序排列,不用填 order by
AS
BEGIN
DECLARE @SortColumn VARCHAR(200)
DECLARE @Operator CHAR(2)
DECLARE @SortTable VARCHAR(200)
DECLARE @SortName VARCHAR(200)
IF @Fields = ''
SET @Fields = '*'
IF @Filter = ''
SET @Filter = 'Where 1=1'
ELSE
SET @Filter = 'Where ' + @Filter
IF @Group <>''
SET @Group = 'GROUP BY ' + @Group IF @Order <> ''
BEGIN
DECLARE @pos1 INT, @pos2 INT
SET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')
IF CHARINDEX(' DESC', @Order) > 0
IF CHARINDEX(' ASC', @Order) > 0
BEGIN
IF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)
SET @Operator = '<='
ELSE
SET @Operator = '>='
END
ELSE
SET @Operator = '<='
ELSE
SET @Operator = '>='
SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')
SET @pos1 = CHARINDEX(',', @SortColumn)
IF @pos1 > 0
SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)
SET @pos2 = CHARINDEX('.', @SortColumn)
IF @pos2 > 0
BEGIN
SET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)
IF @pos1 > 0
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)
ELSE
SET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)
END
ELSE
BEGIN
SET @SortTable = @TableNames
SET @SortName = @SortColumn
END
END
ELSE
BEGIN
SET @SortColumn = @PrimaryKey
SET @SortTable = @TableNames
SET @SortName = @SortColumn
SET @Order = @SortColumn
SET @Operator = '>='
END DECLARE @type varchar(50)
DECLARE @prec int
Select @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
Where o.name = @SortTable AND c.name = @SortName
IF CHARINDEX('char', @type) > 0
SET @type = @type + '(' + CAST(@prec AS varchar) + ')' DECLARE @TopRows INT
SET @TopRows = @PageSize * @CurrentPage + 1
print @TopRows
print @Operator
EXEC('
DECLARE @SortColumnBegin ' + @type + '
SET ROWCOUNT ' + @TopRows + '
Select @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' orDER BY ' + @Order + '
SET ROWCOUNT ' + @PageSize + '
Select ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' orDER BY ' + @Order + '
')
ENDGOCS代码如下:
SqlConnection mySqlConnection = new SqlConnection(ConfigurationManager.AppSettings["sqlcon"]);
SqlCommand mySqlCommand = new SqlCommand("usp_PagingLarge", mySqlConnection);
mySqlCommand.CommandType = CommandType.StoredProcedure; SqlParameter workParm; //数据表名
workParm = mySqlCommand.Parameters.Add("@TableNames", SqlDbType.VarChar, 30);
mySqlCommand.Parameters["@TableNames"].Value = "yy960_zs_dlinfo";
//数据表字段,以","号分隔
workParm = mySqlCommand.Parameters.Add("@Fields", SqlDbType.VarChar, 200);
mySqlCommand.Parameters["@Fields"].Value = "id,uid,pdname,area,tj,addtime"; //查询条件,不需where"
workParm = mySqlCommand.Parameters.Add("@Filter", SqlDbType.VarChar, 500);
mySqlCommand.Parameters["@Filter"].Value = ""; //主表的主键,必须为INT类型
workParm = mySqlCommand.Parameters.Add("@PrimaryKey", SqlDbType.VarChar, 150);
mySqlCommand.Parameters["@PrimaryKey"].Value = "id"; //排序字段列表或条件
workParm = mySqlCommand.Parameters.Add("@Order", SqlDbType.VarChar, 50);
mySqlCommand.Parameters["@Order"].Value = "id desc"; //页号
workParm = mySqlCommand.Parameters.Add("@CurrentPage", SqlDbType.Int);
mySqlCommand.Parameters["@CurrentPage"].Value = intPageNo; //每页显示数
workParm = mySqlCommand.Parameters.Add("@PageSize", SqlDbType.Int);
mySqlCommand.Parameters["@PageSize"].Value = intPageSize; //总记录数(存储过程输出参数)
workParm = mySqlCommand.Parameters.Add("@不知道怎么调", SqlDbType.Int);
workParm.Direction = ParameterDirection.Output; //当前页记录数(存储过程返回值)
workParm = mySqlCommand.Parameters.Add("RowCount", SqlDbType.Int);
workParm.Direction = ParameterDirection.ReturnValue; mySqlConnection.Open();
Repeater.DataSource = mySqlCommand.ExecuteReader(); Repeater.DataBind(); mySqlConnection.Close();
Int32 RecordCount = (Int32)mySqlCommand.Parameters["@不知道怎么调"].Value;
Int32 RowCount = (Int32)mySqlCommand.Parameters["RowCount"].Value; LabelRecord.Text = RecordCount.ToString();
LabelRow.Text = intPageNo.ToString();
intPageCount = RecordCount / intPageSize;
if ((RecordCount % intPageSize) > 0)
intPageCount += 1;
LabelPage.Text = intPageCount.ToString(); if (intPageNo > 1)
{
HLFistPage.NavigateUrl = "?CurrentPage=1";
HLPrevPage.NavigateUrl = String.Concat("?CurrentPage=", "", intPageNo - 1);
}
else
{
HLFistPage.NavigateUrl = "";
HLPrevPage.NavigateUrl = "";
} if (intPageNo < intPageCount)
{
HLNextPage.NavigateUrl = String.Concat("?CurrentPage=", "", intPageNo + 1);
HLEndPage.NavigateUrl = String.Concat("?CurrentPage=", "", intPageCount);
}
else
{
HLNextPage.NavigateUrl = "";
HLEndPage.NavigateUrl = "";
}请高手指点一下总记录数那么怎么调,这个分页才能正常运行
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货