sqlserver 存储过程学习笔记(二) 在项目中的应用<多表分页>

时间:2023-03-08 22:05:57
sqlserver 存储过程学习笔记(二) 在项目中的应用<多表分页>

(1)存储过程建立

USE [NewPlat] GO

/****** Object:  StoredProcedure [dbo].[usp_PagingLarge]    Script Date: 07/11/2013 08:27:44 ******/ SET ANSI_NULLS ON GO

SET QUOTED_IDENTIFIER ON GO

Create PROCEDURE [dbo].[usp_PagingLarge]

@TableNames VARCHAR(200),     --表名,可以是多个表,但不能用别名

@PrimaryKey VARCHAR(100),     --主键,可以为空,但@Order为空时该值不能为空

@Fields     VARCHAR(4000),         --要取出的字段,可以是多个表的字段,可以为空,为空表示select *

@PageSize INT,             --每页记录数

@CurrentPage INT,         --当前页,0表示第1页

@Filter VARCHAR(4000) = '',     --条件,可以为空,不用填 where

@Group VARCHAR(200) = '',     --分组依据,可以为空,不用填 group by

@Order VARCHAR(200) = '',    --排序,可以为空,为空默认按主键升序排列,不用填 order by

@RecordCount int OUTPUT             --总记录数,自己增加(总记录数)

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 + '           ')

IF @RecordCount IS NULL

BEGIN      DECLARE @sql nvarchar(4000)

SET @sql=N'SELECT @RecordCount=COUNT(*)'          +N' FROM '+@TableNames          +N' '+@Filter

EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT

END

END

GO

(2)实现多表分页的函数(c#代码)

public static DataTable ExecMultiPageList(string tableName, string iDName, string Fields, int pageSize, int currentPage, string Filter, string Group, string Order, List<SqlParameter> list, out int rowCount)
        {
            rowCount = 0;
            SqlConnection connection = new SqlConnection(connectionString);
            SqlParameter[] parameters = {  
                    new SqlParameter("@TableNames",SqlDbType.VarChar,200), 
                    new SqlParameter("@PrimaryKey",SqlDbType.VarChar,100), 
                    new SqlParameter("@Fields",SqlDbType.VarChar,200), 
                    new SqlParameter("@PageSize",SqlDbType.Int,4), 
                    new SqlParameter("@CurrentPage",SqlDbType.Int,4), 
                    new SqlParameter("@Filter",SqlDbType.VarChar,200), 
                    new SqlParameter("@Group",SqlDbType.VarChar,200), 
                    new SqlParameter("@Order",SqlDbType.VarChar,200), 
                    new SqlParameter("@RecordCount",SqlDbType.Int,4) 
                };//参数列表 
            parameters[0].Value = tableName;
            parameters[1].Value = iDName;
            parameters[2].Value = Fields;
            parameters[3].Value = pageSize;
            parameters[4].Value = currentPage;
            parameters[5].Value = Filter;
            parameters[6].Value = Group;
            parameters[7].Value = Order;//参数对应值 
            parameters[8].Value = rowCount;
            parameters[8].Direction = ParameterDirection.Output;
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = connection;
            cmd.CommandText = "usp_PagingLarge";//存储过程名 
            cmd.CommandType = CommandType.StoredProcedure;//类型 
            cmd.Parameters.AddRange(parameters);
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            connection.Close();
            rowCount = Convert.ToInt32(parameters[8].Value);//输出 
            return dt;
        }

(3)调用多表分页的方法

public string GetFenye(out int recordcount, NameValueCollection form,string loginid,int flag)         {

QueryModel queryMdodel = QueryModel.getQueryModel(form);

string tablename = "Email_MailSender left join Email_MailInfo on Email_MailSender.mailid=Email_MailInfo.Mailid ";

string iDName = "Email_MailSender.mailsenderid";

string Fields = "Email_MailSender.*,Email_MailInfo.mailtopic,Email_MailInfo.sendtime";

int PageSize = queryMdodel.rows;

int PageIndex = queryMdodel.page == 0 ? 0 : queryMdodel.page - 1;

string Filter = "Email_MailSender.senderid = '" + loginid + "' and Email_MailSender.sendstatus ="+flag;

string group = "";

string order = "Email_MailSender.mailsenderid asc";

DataTable dt = DbHelperSQL.ExecMultiPageList(tablename, iDName, Fields, PageSize, PageIndex, Filter, group, order,queryMdodel.listPar ,out recordcount);

string strjson = Newtonsoft.Json.JsonConvert.SerializeObject(dt);             return strjson;

}