上边这一个例子是项目中同事写的,D.CatalogName上面那句SQL里面有局地出奇处境

createprocsp_PublicTurnPageWebSite(
@TBNamenvarchar(100)=”,–表名,如pinyin
@PageSizeint=10,–每页的记录数,默认为10 @CurPageint=1,–表示当前页1
@KeyFieldnvarchar(100)=’ID’,–关键字段名,默认为ID,该字段要求是表中的索引或无重复和不为空的字段
@KeyAscDescnvarchar(4)=’ASC’,–关键字的升、降序,默认为升序ASC,降序为DESC
@Fieldsnvarchar(500)=’*’,–所选择的列名,默认为全选
@Conditionnvarchar(200)=”,–where条件,默认为空
@Ordernvarchar(200)=”–排序条件,默认为空 )withencryptionas if@TBName=”
begin raiserror(‘请指定表名!’,11,1) return end if@PageSize=0or@CurPage0
begin raiserror(‘当前页数和每页的记录数都必须大于零!’,11,1) return end
if@KeyAscDesc=’DESC’ set@KeyAscDesc=” else set@KeyAscDesc=”
if@Condition” set@Condition=’where’+@Condition
declare@SQLnvarchar(2000) set@SQL=” if@CurPage=1
set@SQL=@SQL+’SelectTop’+cast(@PageSizeasnvarchar(20))+”+@Fields+’FROM’+@TBName+@Condition+”+@Order
else begin declare@iTopNumint set@iTopNum=@PageSize*(@CurPage-1)
set@SQL=@SQL+’declare@sLastValuenvarchar(100)’+char(13)
set@SQL=@SQL+’SelectTop’+cast(@iTopNumasnvarchar(20))+’@sLastValue=’+@KeyField+’FROM’+@TBName+@Condition+”+@Order+char(13)
declare@Condition2nvarchar(200) if@Condition=”
set@Condition2=’where’+@KeyField+@KeyAscDesc+’@sLastValue’ else
set@Condition2=’and’+@KeyField+@KeyAscDesc+’@sLastValue’
set@SQL=@SQL+’SelectTop’+cast(@PageSizeasnvarchar(20))+”+@Fields+’FROM’+@TBName+@Condition+@Condition2+@Order
end EXECUTEsp_executesql@SQL

好久没有上来写点东西了,今天正好有空,共享一些个人心得,就是关于分页的存储过程,这个问题应该是老生重谈了,网上的通用存储过程的类型已经够多了,但是,好象看到的基本上不能够满足一些复杂的SQL语句的分页,比如下面这句:
select”asCheckBox,A.TargetID,A.TargetPeriod,Convert(varchar(10),B.BeginDate,120)asBeginDate,
Convert(varchar(10),B.EndDate,120)asEndDate,C.SalesCode,C.SalesName,D.CatalogCode,D.CatalogName,
E.OrgID,E.OrgName,F.OrgIDasBranchOrgID,F.OrgCodeasBranchOrgCode,F.OrgNameasBranchOrgName,
A.Amount,”asDetailButton fromChlSalesTargetasA
leftouterjoinChlSalesTargetPeriodasBonA.TargetPeriod=B.TargetPeriod
leftouterjoinChlSalesasConA.Sales=C.SalesCode
leftouterjoinChlItemCatalogasDonA.ItemCatalog=D.CatalogCode
leftouterjoinChlOrgasEonA.OrgID=E.OrgID
leftouterjoinChlOrgasFonC.BranchOrgID=F.OrgID
whereA.TargetPeriod=’200607’andA.TargetPeriod=’200608’andF.OrgCodelike’%123%’andE.OrgCodelike’%123%’
orderbyA.TargetPerioddesc,C.SalesName,D.CatalogName上面这句SQL里面有一些特殊情况,比如使用了Convert函数,而且没有主键,有多表连接,有表别名,字段别名等等,这些情况处理起来可能比较棘手,当然,其中的“”asCheckBox”是我系统当中的特例情况,用来做一些处理的。
我这里提供一个自己开发的通用分页存储过程,有什么好的建议和意见,大家请不吝指教。代码如下:

  3、DataBase基类,查询方法返回值是List<T>,并且是分页的,ThePart.dll版本2.0中封装了一个PageInfo类,作为分页的类型。这种方法很机械,也很狗血..建议大家不这么用,下面这个例子是项目中同事写的。为了DataBase这个基类的操作数据库返回值各种类型,让人们知道各种情况的数据都可以处理。的这么一个目的,我还是把例子贴出来。我自己都难得去费神看。

图片 1图片 2Code
Create PROCEDURE [dbo].[usp_PagingLarge]
(  
    @TableNames        VARCHAR(200),            –表名,可以是多个表,但不能用别名  
    @PrimaryKey        VARCHAR(100),            –主键,可以为空,但@Order为空时该值不能为空  
    @Fields            VARCHAR(200) = ‘*’,        –要取出的字段,可以是多个表的字段,可以为空,为空表示select *  
    @PageSize        INT,                    –每页记录数  
    @CurrentPage    INT,                    –当前页,0表示第1页  
    @RecNums        INT output,                –记录个数
    @PageNums        INT output,                — 页数
    @Filter            VARCHAR(200) = ”,        –条件,可以为空,不用填 where  
    @Group            VARCHAR(200) = ”,        –分组依据,可以为空,不用填 group by  
    @Order            VARCHAR(200) = ”        –排序,可以为空,为空默认按主键升序排列,不用填 order by  
)
AS
/*
调用示例:
declare @intRecNums int,@intPageNums int
EXEC usp_PagingLarge
‘TOrders left join TOrder_details on TOrders.order_id = TOrder_details.order_id’,
‘TOrders.order_id’,
‘*’,
5,
0,
@intRecNums output,
@intPageNums output,
‘TOrders.supplier_id = 30’,
”,
‘TOrders.order_id asc’
print ‘记录个数 = ‘ + convert(char,@intRecNums) + ‘ ‘ + ‘页数 = ‘ + convert(char,@intPageNums)
*/
SET NOCOUNT ON
BEGIN  
     DECLARE @SortColumn VARCHAR(200)  
     DECLARE @Operator CHAR(2)  
     DECLARE @SortTable VARCHAR(200)  
     DECLARE @SortName VARCHAR(200)  
     declare @sql nvarchar(4000)
     declare @sqlTemp nvarchar(4000)

通用分页存储过程—-Sp_Paging /**//*

功能:通用分页存储过程 参数:
@PKvarchar(50),主键,用来排序的单一字段,空的话,表示没有主键,存储过程将自动创建标识列主键
@Fieldsvarchar(500),要显示的字段列表(格式如:ID,Code,Name)
@Tablesvarchar(1000),要使用的表集合(Org)
@Wherevarchar(500),查询条件(Codelike’100′)
@OrderByvarchar(100),排序条件(支持多个排序字段,如:ID,Codedesc,Namedesc)
@PageIndexint,当前要显示的页的页索引,索引从1开始,无记录时为0。
@PageSizeint,页大小 创建者:HollisYao 创建日期:2006-08-06 备注:
============================================================ */
CreatePROCEDURE[dbo].[Sp_Paging] @PKvarchar(50)=”,
@Fieldsvarchar(500), @Tablesvarchar(1000), @Wherevarchar(500)=”,
@OrderByvarchar(100), @PageIndexint, @PageSizeint AS
–替换单引号,避免构造SQL出错 set@Fields=replace(@Fields,””,”””)
–要执行的SQL,切分为几个字符串,避免出现长度超过4k时的问题
declare@SQL1varchar(4000) declare@SQL2varchar(4000) set@SQL1=”
set@SQL2=” if@Whereisnotnullandlen(ltrim(rtrim(@Where)))0
set@Where=’where’+@Where else set@Where=’where1=1′
set@SQL1=@SQL1+’declare@TotalCountint’–声明一个变量,总记录数
set@SQL1=@SQL1+’declare@PageCountint’–声明一个变量,总页数
set@SQL1=@SQL1+’declare@PageIndexint’–声明一个变量,页索引
set@SQL1=@SQL1+’declare@StartRowint’–声明一个变量,当前页第一条记录的索引
set@SQL1=@SQL1+’select@TotalCount=count(*)from’+@Tables+@Where–获取总记录数
set@SQL1=@SQL1+’if@PageCount=0begin’–如果记录数为0,直接输出空的结果集
set@SQL1=@SQL1+’select’+@Fields+’from’+@Tables+’where11′
set@SQL1=@SQL1+’select0asPageIndex,0asPageCount,’+convert(varchar,@PageSize)+’asPageSize,0asTotalCount’
set@SQL1=@SQL1+’returnend’
set@SQL1=@SQL1+’set@PageCount=(@TotalCount+’+convert(varchar,@PageSize)+’-1)/’+convert(varchar,@PageSize)–获取总页数
set@SQL1=@SQL1+’set@PageIndex=’+convert(varchar,@PageIndex)–设置正确的页索引
set@SQL1=@SQL1+’if@PageIndex0set@PageIndex=1′
set@SQL1=@SQL1+’if@PageIndex@PageCountand@PageCount0set@PageIndex=@PageCount’
set@SQL1=@SQL1+’set@StartRow=(@PageIndex-1)*’+convert(varchar,@PageSize)+’+1′
if(charindex(‘,’,@OrderBy)=0andcharindex(@PK,@OrderBy)0) begin
–****************************************************************************
–****************不需要创建主键********************************************
–****************************************************************************
declare@SortDirectionvarchar(10)–排序方向,=:升序,=:倒序
set@SortDirection=’=’ ifcharindex(‘desc’,@OrderBy)0
set@SortDirection=’=’
set@SQL2=@SQL2+’declare@Sortvarchar(100)’–声明一个变量,用来记录当前页第一条记录的排序字段值
set@SQL2=@SQL2+’setrowcount@StartRow’–设置返回记录数截止到当前页的第一条
set@SQL2=@SQL2+’select@Sort=’+@PK+’from’+@Tables+@Where+’orderby’+@OrderBy–获取当前页第一个排序字段值
set@SQL2=@SQL2+’setrowcount’+convert(varchar,@PageSize)–设置返回记录数为页大小
set@Where=@Where+’and’+@PK+@SortDirection+’@Sort’
set@SQL2=@SQL2+’select’+@Fields+’from’+@Tables+@Where+’orderby’+@OrderBy–输出最终显示结果
end else begin
–****************************************************************************
–*************需要创建自增长主键******************************************
–****************************************************************************
set@SQL2=@SQL2+’declare@EndRowint’
set@SQL2=@SQL2+’set@EndRow=@PageIndex*’+convert(varchar,@PageSize)
set@SQL2=@SQL2+’setrowcount@EndRow’
set@SQL2=@SQL2+’declare@PKBeginint’–声明一个变量,开始索引
set@SQL2=@SQL2+’declare@PKEndint’–声明一个变量,结束索引
set@SQL2=@SQL2+’set@PKBegin=@StartRow’
set@SQL2=@SQL2+’set@PKEnd=@EndRow’
–****************************************************************************
–************对特殊字段进行转换,以便可以插入到临时表******************
–****************************************************************************
declare@TempFieldsvarchar(500) set@TempFields=@Fields
set@TempFields=replace(@TempFields,””’asCheckBox’,”)
set@TempFields=replace(@TempFields,””’asDetailButton’,”)
set@TempFields=replace(@TempFields,””’asRadio’,”)
set@TempFields=LTRIM(RTRIM(@TempFields))
ifleft(@TempFields,1)=’,’–去除最左边的逗号
set@TempFields=substring(@TempFields,2,len(@TempFields))
ifright(@TempFields,1)=’,’–去除最右边的逗号
set@TempFields=substring(@TempFields,1,len(@TempFields)-1)
set@SQL2=@SQL2+’selectidentity(int,1,1)asPK,’+@TempFields+’into#tbfrom’+@Tables+@Where+’orderby’+@OrderBy
–****************************************************************************
–********去除字段的表名前缀,当有字段有别名时,只保留字段别名*********
–****************************************************************************
declare@TotalFieldsvarchar(500) declare@tmpvarchar(50) declare@iint
declare@jint declare@iLeftint–左括号的个数
declare@iRightint–右括号的个数 set@i=0 set@j=0 set@iLeft=0 set@iRight=0
set@tmp=” set@TotalFields=” while(len(@Fields)0) begin
set@i=charindex(‘,’,@Fields) –去除字段的表名前缀 if(@i=0) begin
–找不到逗号分割,即表示只剩下最后一个字段 set@tmp=@Fields end else
begin set@tmp=substring(@Fields,1,@i) end set@j=charindex(‘.’,@tmp)
if(@j0) set@tmp=substring(@tmp,@j+1,len(@tmp))
–*******当有字段有别名时,只保留字段别名*********
–带括号的情况要单独处理,如Convert(varchar(10),B.EndDate,120)asEndDate
while(charindex(‘(‘,@tmp)0) begin set@iLeft=@iLeft+1
set@tmp=substring(@tmp,charindex(‘(‘,@tmp)+1,Len(@tmp)) end
while(charindex(‘)’,@tmp)0) begin set@iRight=@iRight+1
set@tmp=substring(@tmp,charindex(‘)’,@tmp)+1,Len(@tmp)) end
–当括号恰好组队的时候,才能进行字段别名的处理 if(@iLeft=@iRight) begin
set@iLeft=0 set@iRight=0
–不对这几个特殊字段作处理:CheckBox、DetailButton、Radio
if(charindex(‘CheckBox’,@tmp)=0andcharindex(‘DetailButton’,@tmp)=0andcharindex(‘Radio’,@tmp)=0)
begin –判断是否有别名
if(charindex(‘as’,@tmp)0)–别名的第一种写法,带’as’的格式 begin
set@tmp=substring(@tmp,charindex(‘as’,@tmp)+2,len(@tmp)) end else begin
if(charindex(”,@tmp)0)–别名的第二种写法,带空格(“”)的格式 begin
while(charindex(”,@tmp)0) begin
set@tmp=substring(@tmp,charindex(”,@tmp)+1,len(@tmp)) end end end end
set@TotalFields=@TotalFields+@tmp end if(@i=0) set@Fields=” else
set@Fields=substring(@Fields,@i+1,len(@Fields)) end –print@TotalFields
set@SQL2=@SQL2+’select’+@TotalFields+’from#tbwherePKbetween@PKBeginand@PKEndorderbyPK’–输出最终显示结果
set@SQL2=@SQL2+’droptable#tb’ end
–输出“PageIndex(页索引)、PageCount(页数)、PageSize(页大小)、TotalCount(总记录数)”
set@SQL2=@SQL2+’select@PageIndexasPageIndex,@PageCountasPageCount,’
+convert(varchar,@PageSize)+’asPageSize,@TotalCountasTotalCount’
–print@SQL1+@SQL2 exec(@SQL1+@SQL2)
如果使用这个通用分页存储过程的话,那么调用方法如下:

        public static
List<SportsBetRecords> SportsGetListPager(string SaleID, string
UserName, string status, string classtype, string StarTime, string
EndTime, int? pSize, int? pIndex, out int count)
        {
            pSize = pSize ??
10;  //每页最大记录数
            pIndex = pIndex ??
1;  //当前第几页
            PagerInfo pager = new
PagerInfo();  //ThePart.dll中封装的这么一个分页类PagerInfo
            pager.ProcName =
“pr_Pager2005”;  //需要的数据库的存储过程
            pager.TableNames =
“SportsBetRecords”;  //需要操作的数据库表名
            pager.PageSize =
(int)pSize;    //最大记录数
            pager.CurrentPage =
(int)pIndex;    //当前第几页
            StringBuilder sb = new
StringBuilder(“1=1 and SaleID='” + SaleID +
“‘”);  //可变字符串的条件
            if
(!string.IsNullOrEmpty(UserName))
                sb.Append(” and
UserName='” + UserName + “‘”);  
            if
(!string.IsNullOrEmpty(StarTime) &&
!string.IsNullOrEmpty(EndTime))
                sb.Append(” and [T]
between ‘” + Convert.ToDateTime(StarTime) + “‘ and ‘” +
Convert.ToDateTime(EndTime).AddDays(1) + “‘”);
            pager.Condition =
sb.ToString();    //sql里面where后的条件
            pager.Count = 1;
            pager.Fields = “*”;
            pager.IndexName =
“Id”;
            pager.OrderNames = “[T]
desc”;
            List<SportsBetRecords>
recordList = ORMBase.GetList<SportsBetRecords>(ref
pager);
            count = pager.Count;
            return recordList;
        }

     IF @Fields = ”  
         SET @Fields = ‘*’  
     IF @Filter = ”  
         SET @Filter = ‘Where 1=1’  
     ELSE  
         SET @Filter = ‘Where 1=1’ +   @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

使用通用分页存储过程进行分页 /**//*

功能:获取销售目标,根据条件 参数: @UserTypeint, @OrgIDvarchar(500),
@TargetPeriodBeginnvarchar(50), @TargetPeriodEndnvarchar(50),
@BranchOrgCodenvarchar(50), @BranchOrgNamenvarchar(50),
@OrgCodenvarchar(50), @OrgNamenvarchar(50), @SalesCodenvarchar(50),
@SalesNamenvarchar(50), @CatalogCodenvarchar(50),
@CatalogNamenvarchar(50),
@PageIndexint,当前要显示的页的页索引,索引从1开始,无记录时为0。
@PageSizeint,页大小 创建者:HollisYao 创建日期:2006-08-11 备注:
============================================================ */
CreatePROCEDURE[dbo].[GetSalesTargetList] @UserTypeint,
@OrgIDnvarchar(500), @TargetPeriodBeginnvarchar(50),
@TargetPeriodEndnvarchar(50), @BranchOrgCodenvarchar(50),
@BranchOrgNamenvarchar(50), @OrgCodenvarchar(50), @OrgNamenvarchar(50),
@SalesCodenvarchar(50), @SalesNamenvarchar(50),
@CatalogCodenvarchar(50), @CatalogNamenvarchar(50), @PageIndexint,
@PageSizeint AS declare@Conditionnvarchar(2000) set@Condition=”
if(@UserType1) set@Condition=@Condition+’andA.OrgIDin(‘+@OrgID+’)’
if(len(@TargetPeriodBegin)0)
set@Condition=@Condition+’andA.TargetPeriod=”’+@TargetPeriodBegin+””
if(len(@TargetPeriodEnd)0)
set@Condition=@Condition+’andA.TargetPeriod=”’+@TargetPeriodEnd+””
if(len(@BranchOrgCode)0)
set@Condition=@Condition+’andF.OrgCodelike”%’+@BranchOrgCode+’%”’
if(len(@BranchOrgName)0)
set@Condition=@Condition+’andF.OrgNamelike”%’+@BranchOrgName+’%”’
if(len(@OrgCode)0)
set@Condition=@Condition+’andE.OrgCodelike”%’+@OrgCode+’%”’
if(len(@OrgName)0)
set@Condition=@Condition+’andE.OrgNamelike”%’+@OrgName+’%”’
if(len(@SalesCode)0)
set@Condition=@Condition+’andC.SalesCodelike”%’+@SalesCode+’%”’
if(len(@SalesName)0)
set@Condition=@Condition+’andC.SalesNamelike”%’+@SalesName+’%”’
if(len(@CatalogCode)0)
set@Condition=@Condition+’andD.CatalogCodelike”%’+@CatalogCode+’%”’
if(len(@CatalogName)0)
set@Condition=@Condition+’andD.CatalogNamelike”%’+@CatalogName+’%”’
if(len(@Condition)0)
set@Condition=substring(@Condition,5,len(@Condition)) –print@Condition
execsp_Paging
N”,N”’asCheckBox,A.TargetID,A.TargetPeriod,Convert(varchar(10),B.BeginDate,120)asBeginDate,Convert(varchar(10),B.EndDate,120)asEndDate,
C.SalesCode,C.SalesName,D.CatalogCode,D.CatalogName,E.OrgID,E.OrgName,F.OrgIDasBranchOrgID,F.OrgCodeasBranchOrgCode,F.OrgNameasBranchOrgName,A.Amount,”asDetailButton’,
N’ChlSalesTargetasA
leftouterjoinChlSalesTargetPeriodasBonA.TargetPeriod=B.TargetPeriod
leftouterjoinChlSalesasConA.Sales=C.SalesCode
leftouterjoinChlItemCatalogasDonA.ItemCatalog=D.CatalogCode
leftouterjoinChlOrgasEonA.OrgID=E.OrgID
leftouterjoinChlOrgasFonC.BranchOrgID=F.OrgID’, @Condition,
N’A.TargetPerioddesc,C.SalesName,D.CatalogName’, @PageIndex,@PageSize

 

— 统计记录个数 
set @sqlTemp = ‘Select @counts=count(*) FROM   ‘ + @TableNames + ‘ ‘ + @Filter

以下是相应该存储过程:

—-取得查询结果总数量—–
exec sp_executesql @sqlTemp,N’@counts int out’,@RecNums out

USE [Casino]
GO
/****** Object:  StoredProcedure
[dbo].[pr_Pager2005]    Script Date: 05/13/2014 15:05:28
******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE
[dbo].[pr_Pager2005]
(
    @TableNames VARCHAR(4000), — 表名

–取得分页总数
if @RecNums <= @pageSize
    set @PageNums = 1
else
    set @PageNums = (@RecNums / @pageSize) + 1

    @Fields VARCHAR(1000) = ‘*’, —
需要返回的列(不能有相同的字段出现,如有相同字段,可把第一个外的其它字段转为别名,如:b.ID
As bID)
    @Condition VARCHAR(1500) = ”, —
查询条件
    @IndexName VARCHAR(20) = ‘ID’, —
主索引字段(此处作废,只为兼容)
    @PageSize INT = 20, — 每页记录数

select @sql = ‘DECLARE @SortColumnBegin ‘ + @type + ‘  
         SET ROWCOUNT ‘ + convert(char,@TopRows) + ‘  
         Select @SortColumnBegin=’ + @SortColumn + ‘ FROM   ‘ + @TableNames + ‘ ‘ + @Filter + ‘ ‘ + @Group + ‘ orDER BY ‘ + @Order + ‘  
         SET ROWCOUNT ‘ + convert(char,@PageSize) + ‘  
         Select ‘ + @Fields + ‘ FROM   ‘ + @TableNames + ‘ ‘ + @Filter   + ‘ AND ‘ + @SortColumn + ‘ ‘ + @Operator + ‘@SortColumnBegin ‘ + @Group + ‘ orDER BY ‘ + @Order

    @CurrentPage INT = 1, —
当前页码
    @OrderNames VARCHAR(50) = ”, —
排序字段,要包括排序类型
    @OrderType BIT = 1, —
排序类型,0-降序  1-升序(默认)(此处作废,只为兼容)
    @Count INT=null OUTPUT ,
    @Distinct VARCHAR(9)=”,
–去重复记录distinct
    @GroupBy VARCHAR(100)=”,
    @TSQL nVARCHAR(4000)=” OUTPUT
–本次执行的TSQL语句或在分页前执行的TSQL
)
AS
    DECLARE @SQL nVARCHAR(max) —
主语句
    DECLARE @OrderBy VARCHAR(300) —
排序
    DECLARE @StartRow INT,@ENDRow
INT

–print @sql
——返回查询结果—–
exec sp_executesql @sql
END   

    SET @SQL = ”
    
    BEGIN
        SET NOCOUNT ON
        IF(@CurrentPage<1)
            SET @CurrentPage = 1

        SET @StartRow =
(@CurrentPage-1)*@PageSize+1
        SET @ENDRow =
@CurrentPage*@PageSize

        IF(@Condition != ”)
            SET @Condition = ‘ Where ‘ +
@Condition

        IF(@GroupBy!=”)
            SET @GroupBy = ‘ Group By ‘ +
@GroupBy

        IF(@Distinct!=”)
            SET @Distinct = @Distinct + ‘

        IF(@OrderNames = ”)
            SET @OrderBy = ”
        ELSE
            SET @OrderBy = ‘ Order By ‘ +
@OrderNames

        IF ((@Count is not null) And
@Count > 0 )
        BEGIN

            IF(@GroupBy=”)
                SET @SQL = @TSQL + ‘
Select ‘ +@Distinct+ ‘ @c=Count(0) From ‘ + @TableNames +
@Condition
            ELSE
                SET @SQL = @TSQL + ‘
Select ‘ +@Distinct+ ‘ @c=Count(0) From (Select 0 As ID From ‘ +
@TableNames + @Condition + @GroupBy +’) As T’

相关文章

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图