(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;

}

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

  1. sqlserver存储过程学习笔记(一)基础知识篇(全)

    说出来有点丢人,做sqlserver应用系统近一年,竟然没有使用过存储过程,现在就好好的梳理一下对应知识,慢慢让其加入到我的项目中去吧. 存储过程的优点:1.运行效率高,提供了在服务器端快速执行sql ...

  2. SqlServer存储过程学习笔记(增删改查)

    * IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...

  3. django学习笔记二:一个项目多个App项目搭建

    django充许在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户 本次测试 ...

  4. Cocos2dx 学习笔记整理----在项目中使用图片(三)

    这节练习下DragonBones. 手机由于性能所限,需要特注意资源的使用. 游戏项目的话由于资源比较多,一般都会用到DragonBones来做动作,这个又称为龙骨. DragonBones传送点:h ...

  5. Cocos2dx 学习笔记整理----在项目中使用图片(一)

    cocos2dx有多种使用图片的方法,先来个最简单的:用CCSprite直接使用图片. 首先,进入到之前建立的项目,把你将要使用的图片放入到目录下的Resources文件夹里面.项目中以相对路径使用资 ...

  6. Java学习笔记二十:Java中的内部类

    Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...

  7. Cocos2dx 学习笔记整理----在项目中使用图片(二)

    之前了解了一种比较简单的图片的使用方式, 今次来了解稍微复杂一点的图片使用方式,plist+png. 这里要用到之前提到的Texture Packer. Texture Packer是一款图片打包工具 ...

  8. Android Studio安卓学习笔记(二)Android项目结构

    上一篇代码,我们学习了Android的功能以及如何用Android Studio开发第一个安卓程序.下面就要介绍Android项目结构.为日后学习打基础. 一:Android项目结构 打开MyFris ...

  9. PMBOK学习笔记二-项目管理过程

    项目管理过程可归纳为五类,即五大项目管理过程组 启动过程组.定义一个新项目或现有项目的一个新阶段,授权开始该项目或阶段的一组过程..规划过程组.明确项目范围,优化目标,为实现目标制定行动方案的一组过程 ...

随机推荐

  1. 你知道hover、active这四个伪类为什么要按顺序写吗

    刨根问底,你知道:hover等4个伪类为什么要按顺序排列吗 引言 :link,:visited,:hover,:active这4个伪类大家都不陌生,4个伪类要按照LvHa这个爱恨原则来排(外国友人起的 ...

  2. android开发隐藏了actionbar仍然短暂闪现的解决方法

    有时候我们在代码里隐藏了actionbar,在打开应用时,仍然短暂闪现下actionbar,用户体验很不好.   最简单的方法是 在AndroidManifest.xml中设置主题中配置不显示titl ...

  3. SDUT 2860-生日Party(BFS)

    生日Party Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 Sherlock的生日即将来临,Sherlock打算邀请几个好 ...

  4. 11181 - Probability|Given

    N friends go to the local super market together. The probability of their buying something from them ...

  5. boost操作xml 5分钟官方教程

    Five Minute Tutorial This tutorial uses XML. Note that the library is not specifically bound to XML, ...

  6. document.body的一些用法以及js中的常见问题

    document.body的一些用法以及js中的常见问题 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight ...

  7. Linux经常使用命令(十二) - less

    less 工具也是对文件或其他输出进行分页显示的工具.应该说是linux正统查看文件内容的工具.功能极其强大. less 的使用方法比起 more 更加的有弹性.使用了 less 时.更easy用来查 ...

  8. android5.0(Lollipop) BLE Central牛刀小试

    转载请表明作者:http://blog.csdn.net/lansefeiyang08/article/details/46482073 昨天写了android L BLE Peripheral的简单 ...

  9. HDU 3966 Aragorn&#39;s Story(树链剖分)

    HDU Aragorn's Story 题目链接 树抛入门裸题,这题是区间改动单点查询,于是套树状数组就OK了 代码: #include <cstdio> #include <cst ...

  10. SQL SERVER 2008- 字符串函数

    /* 1,ASCII返回字符表达式中最左侧字符的ASCII代码值 仅返回首字母的ASCII码值 parameter char或varchar returns integer */ SELECT ASC ...