解决方案 »

  1.   

        if @OrderType != 0  
            begin
                set @strTmp = '<(select min'
                set @strOrder = ' order by [' + @fldName +'] desc'这句我不明白你select min是什么意图。
      

  2.   

    其实我也不太明白,这里应该是排序条件的关键点,传过来的这个字段放到select min函数里就是必须一个字段吧,多个字段的话不知怎么改了,这个存储过程是我同事弄的,估计也是网上来的!
      

  3.   

    其实我也不太明白,这里应该是排序条件的关键点,传过来的这个字段放到select min函数里就是必须一个字段吧,多个字段的话不知怎么改了,这个存储过程是我同事弄的,估计也是网上来的!你能把那个语句打印出了不,就是那个exec之前的那个 print语句,把语句打印出来,贴出来看看
      

  4.   

    把你的参数传进去,然后print出来,我觉得如果是按条件排序,那个select min是多余的
      

  5.   

     在--以下代码赋予了@strSQL以真正执行的SQL代码
    没有给查询结果的列取别名        
    @strTmp + '(['+ @fldName + ']) from (select top ' 改成
     @strTmp + '(['+ @fldName + ']) '+@fldName +'from (select top '  
    后面如果还有中间结果集的话也加上别名   
      

  6.   

    其实我也不太明白,这里应该是排序条件的关键点,传过来的这个字段放到select min函数里就是必须一个字段吧,多个字段的话不知怎么改了,这个存储过程是我同事弄的,估计也是网上来的!你能把那个语句打印出了不,就是那个exec之前的那个 print语句,把语句打印出来,贴出来看看打不出来撒,存储过程里,不知道怎么打呀,我也想看看...
      

  7.   

    其实我也不太明白,这里应该是排序条件的关键点,传过来的这个字段放到select min函数里就是必须一个字段吧,多个字段的话不知怎么改了,这个存储过程是我同事弄的,估计也是网上来的!你能把那个语句打印出了不,就是那个exec之前的那个 print语句,把语句打印出来,贴出来看看打不出来撒,存储过程里,不知道怎么打呀,我也想看看...我改了一下,把exec这句注释掉,把上面的print的注释符号去掉了:
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    ------           海量数据库分页存储过程             ------
    --参数列表:
    --@tblName -- 表名(必添);
    --@pkid   --主键
    --@strGetFields -- 需要返回的列(默认所有列);
    --@fldName -- 排序的字段名(必添);
    --@PageSize -- 页尺寸(默认每页10条);
    --@PageIndex -- 页码(默认第1页);
    --@doCount -- 返回记录总数,非"0"值则返回(用处不大);
    --@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
    --@strWhere -- 查询条件(警告:不需要加 where);
    --调用示例:exec PageShow TEST,ID,"*" order ,20,1,0,1,"name='DF'"--调用示例:
    --exec PageShow 
    -- @tblName="表名",
    -- @pkid="主键",
    -- @strGetFields="需要返回的列(默认所有列)",
    -- @fldName="排序的字段名",
    -- @PageSize=页尺寸(默认每页10条),
    -- @PageIndex=页码(默认第1页),
    -- @doCount=返回记录总数,非"0"值则返回(用处不大),
    -- @OrderType=设置排序类型,非"0"值则降序(默认正序),
    -- @strWhere="查询条件(警告:不需要加 where)例如StuSex='男'"
    ---------------------------------------------------------
    ALTER PROCEDURE [dbo].[PageShow]
    @doCount  int= 0 ,
    @tblName   varchar(255),
    @strWhere  varchar(1500) = '',
    @pkid varchar(50) = '*',
    @strGetFields varchar(1000) = '*',
    @fldName varchar(255)='',
    @OrderType int = 0,
    @PageSize   int = 10,
    @PageIndex  int = 1AS
    declare @strSQL   varchar(5000)       -- 主语句
    declare @strTmp   varchar(110)        -- 临时变量
    declare @strOrder varchar(400)        -- 排序类型begin tran
    if @doCount != 0
    begin
    if @strWhere !=''
    begin
    set @strSQL = 'select count(['+@pkid+']) as Total from ['+ @tblName +'] where '+@strWhere
    end
    else
    begin
    set @strSQL = 'select count(['+@pkid+']) as Total from [' + @tblName + ']'
    end
    print @Strsql
    end  --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
    else
    begin
    if @OrderType != 0  
    begin
    set @strTmp = '<(select min'
    set @strOrder = ' order by [' + @fldName +'] desc'
    --如果@OrderType不是0,就执行降序,这句很重要!
    end
    else
    begin
    set @strTmp = '>(select max'
    set @strOrder = ' order by [' + @fldName +'] asc'
    end
    if @PageIndex = 1
    begin
    if @strWhere != ''   
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
    else
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['+ @tblName + '] '+ @strOrder
    --如果是第一页就执行以上代码,这样会加快执行速度
    end
    else
    begin
    --以下代码赋予了@strSQL以真正执行的SQL代码
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder
    if @strWhere != ''
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
    + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
    + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
    end 
    end   
    print @strSQL
    --exec (@strSQL)
    if @@error<>0
    rollback
    else
    commit tran
      

  8.   


    把存储过程中的这个:--print @strSQL
    exec (@strSQL)改为
    print @strSQL
    --exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看
      

  9.   


    把存储过程中的这个:--print @strSQL
    exec (@strSQL)改为
    print @strSQL
    --exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看/// <summary>
            /// 获取信息条数
            /// </summary>
            /// <param name="pager">条件</param>
            /// <returns></returns>
            public int GetUnitListCount(PagerCondition pager)
            {
                //--参数列表:
                //--@tblName -- 表名(必添);
                //--@pkid   --主键
                //--@strGetFields -- 需要返回的列(默认所有列);
                //--@fldName -- 排序的字段名(必添);
                //--@PageSize -- 页尺寸(默认每页10条);
                //--@PageIndex -- 页码(默认第1页);
                //--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
                //--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
                //--@strWhere -- 查询条件(警告:不需要加 where); 
                SqlParameter[] parameters = { new SqlParameter("@tblName", pager.TblName),
                                              new SqlParameter("@pkid",pager.Pkid),
                                              new SqlParameter("@strGetFields",pager.StrGetiFelds),
                                              new SqlParameter("@fldName",pager.FldName),
                                              new SqlParameter("@PageSize",pager.PageSize),
                                              new SqlParameter("@PageIndex",pager.PageIndex),
                                              new SqlParameter("@doCount",1),
                                              new SqlParameter("@OrderType",pager.OrderType),
                                              new SqlParameter("@strWhere",pager.StrWhere)
                                            };
                try
                {
                    DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.Connection, CommandType.StoredProcedure, "NewPageShow", parameters);                if (ds.Tables[0].Rows.Count > 0)
                    {
                        return Convert.ToInt32(ds.Tables[0].Rows[0][0]);
                    }
                    else
                    {
                        return 0;
                    }            }
                catch (Exception)
                {                throw;
                }
                finally
                {            }
            }报错了撒.....
    下面是我引用的
    private void BindDataList()
            {
                //--参数列表:
                //--@tblName -- 表名(必添);
                //--@pkid   --主键
                //--@strGetFields -- 需要返回的列(默认所有列);
                //--@fldName -- 排序的字段名(必添);
                //--@PageSize -- 页尺寸(默认每页10条);
                //--@PageIndex -- 页码(默认第1页);
                //--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
                //--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
                //--@strWhere -- 查询条件(警告:不需要加 where);  
                pager.TblName = "A_001";
                pager.Pkid = "OID_A001";
                pager.StrGetiFelds = "*";
                pager.FldName = "F3_A001 asc,F6_A001";
                AspNetPager1.PageSize = 20;
                pager.PageSize = AspNetPager1.PageSize;
                pager.PageIndex = AspNetPager1.CurrentPageIndex;
                pager.DoCount = 0;
                pager.OrderType = 0;
                pager.StrWhere = " F4_A001='Unit' and F3_A001 in (1,3)" + strQuery;
                NewsList.DataSource = dbll.GetUnitList(pager);
                AspNetPager1.RecordCount = Convert.ToInt32(dbll.GetUnitListCount(pager));
                NewsList.DataBind();
            }
      

  10.   

    就是执行到GetUnitListCount方法 报错的 再就跟不下去了 咋办?
      

  11.   


    把存储过程中的这个:--print @strSQL
    exec (@strSQL)改为
    print @strSQL
    --exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看/// <summary>
            /// 获取信息条数
            /// </summary>
            /// <param name="pager">条件</param>
            /// <returns></returns>
            public int GetUnitListCount(PagerCondition pager)
            {
                //--参数列表:
                //--@tblName -- 表名(必添);
                //--@pkid   --主键
                //--@strGetFields -- 需要返回的列(默认所有列);
                //--@fldName -- 排序的字段名(必添);
                //--@PageSize -- 页尺寸(默认每页10条);
                //--@PageIndex -- 页码(默认第1页);
                //--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
                //--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
                //--@strWhere -- 查询条件(警告:不需要加 where); 
                SqlParameter[] parameters = { new SqlParameter("@tblName", pager.TblName),
                                              new SqlParameter("@pkid",pager.Pkid),
                                              new SqlParameter("@strGetFields",pager.StrGetiFelds),
                                              new SqlParameter("@fldName",pager.FldName),
                                              new SqlParameter("@PageSize",pager.PageSize),
                                              new SqlParameter("@PageIndex",pager.PageIndex),
                                              new SqlParameter("@doCount",1),
                                              new SqlParameter("@OrderType",pager.OrderType),
                                              new SqlParameter("@strWhere",pager.StrWhere)
                                            };
                try
                {
                    DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.Connection, CommandType.StoredProcedure, "NewPageShow", parameters);                if (ds.Tables[0].Rows.Count > 0)
                    {
                        return Convert.ToInt32(ds.Tables[0].Rows[0][0]);
                    }
                    else
                    {
                        return 0;
                    }            }
                catch (Exception)
                {                throw;
                }
                finally
                {            }
            }报错了撒.....
    下面是我引用的
    private void BindDataList()
            {
                //--参数列表:
                //--@tblName -- 表名(必添);
                //--@pkid   --主键
                //--@strGetFields -- 需要返回的列(默认所有列);
                //--@fldName -- 排序的字段名(必添);
                //--@PageSize -- 页尺寸(默认每页10条);
                //--@PageIndex -- 页码(默认第1页);
                //--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
                //--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
                //--@strWhere -- 查询条件(警告:不需要加 where);  
                pager.TblName = "A_001";
                pager.Pkid = "OID_A001";
                pager.StrGetiFelds = "*";
                pager.FldName = "F3_A001 asc,F6_A001";
                AspNetPager1.PageSize = 20;
                pager.PageSize = AspNetPager1.PageSize;
                pager.PageIndex = AspNetPager1.CurrentPageIndex;
                pager.DoCount = 0;
                pager.OrderType = 0;
                pager.StrWhere = " F4_A001='Unit' and F3_A001 in (1,3)" + strQuery;
                NewsList.DataSource = dbll.GetUnitList(pager);
                AspNetPager1.RecordCount = Convert.ToInt32(dbll.GetUnitListCount(pager));
                NewsList.DataBind();
            }我加你了,你也加我关注,可以发私信,帮你看看
      

  12.   


    把存储过程中的这个:--print @strSQL
    exec (@strSQL)改为
    print @strSQL
    --exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看/// <summary>
            /// 获取信息条数
            /// </summary>
            /// <param name="pager">条件</param>
            /// <returns></returns>
            public int GetUnitListCount(PagerCondition pager)
            {
                //--参数列表:
                //--@tblName -- 表名(必添);
                //--@pkid   --主键
                //--@strGetFields -- 需要返回的列(默认所有列);
                //--@fldName -- 排序的字段名(必添);
                //--@PageSize -- 页尺寸(默认每页10条);
                //--@PageIndex -- 页码(默认第1页);
                //--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
                //--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
                //--@strWhere -- 查询条件(警告:不需要加 where); 
                SqlParameter[] parameters = { new SqlParameter("@tblName", pager.TblName),
                                              new SqlParameter("@pkid",pager.Pkid),
                                              new SqlParameter("@strGetFields",pager.StrGetiFelds),
                                              new SqlParameter("@fldName",pager.FldName),
                                              new SqlParameter("@PageSize",pager.PageSize),
                                              new SqlParameter("@PageIndex",pager.PageIndex),
                                              new SqlParameter("@doCount",1),
                                              new SqlParameter("@OrderType",pager.OrderType),
                                              new SqlParameter("@strWhere",pager.StrWhere)
                                            };
                try
                {
                    DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.Connection, CommandType.StoredProcedure, "NewPageShow", parameters);                if (ds.Tables[0].Rows.Count > 0)
                    {
                        return Convert.ToInt32(ds.Tables[0].Rows[0][0]);
                    }
                    else
                    {
                        return 0;
                    }            }
                catch (Exception)
                {                throw;
                }
                finally
                {            }
            }报错了撒.....
    下面是我引用的
    private void BindDataList()
            {
                //--参数列表:
                //--@tblName -- 表名(必添);
                //--@pkid   --主键
                //--@strGetFields -- 需要返回的列(默认所有列);
                //--@fldName -- 排序的字段名(必添);
                //--@PageSize -- 页尺寸(默认每页10条);
                //--@PageIndex -- 页码(默认第1页);
                //--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
                //--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
                //--@strWhere -- 查询条件(警告:不需要加 where);  
                pager.TblName = "A_001";
                pager.Pkid = "OID_A001";
                pager.StrGetiFelds = "*";
                pager.FldName = "F3_A001 asc,F6_A001";
                AspNetPager1.PageSize = 20;
                pager.PageSize = AspNetPager1.PageSize;
                pager.PageIndex = AspNetPager1.CurrentPageIndex;
                pager.DoCount = 0;
                pager.OrderType = 0;
                pager.StrWhere = " F4_A001='Unit' and F3_A001 in (1,3)" + strQuery;
                NewsList.DataSource = dbll.GetUnitList(pager);
                AspNetPager1.RecordCount = Convert.ToInt32(dbll.GetUnitListCount(pager));
                NewsList.DataBind();
            }我加你了,你也加我关注,可以发私信,帮你看看我加了发信了,困扰我两天的问题》
      

  13.   


    把存储过程中的这个:--print @strSQL
    exec (@strSQL)改为
    print @strSQL
    --exec (@strSQL)再执行以下存储过程,就能把语句打印出来,你贴出来看看/// <summary>
            /// 获取信息条数
            /// </summary>
            /// <param name="pager">条件</param>
            /// <returns></returns>
            public int GetUnitListCount(PagerCondition pager)
            {
                //--参数列表:
                //--@tblName -- 表名(必添);
                //--@pkid   --主键
                //--@strGetFields -- 需要返回的列(默认所有列);
                //--@fldName -- 排序的字段名(必添);
                //--@PageSize -- 页尺寸(默认每页10条);
                //--@PageIndex -- 页码(默认第1页);
                //--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
                //--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
                //--@strWhere -- 查询条件(警告:不需要加 where); 
                SqlParameter[] parameters = { new SqlParameter("@tblName", pager.TblName),
                                              new SqlParameter("@pkid",pager.Pkid),
                                              new SqlParameter("@strGetFields",pager.StrGetiFelds),
                                              new SqlParameter("@fldName",pager.FldName),
                                              new SqlParameter("@PageSize",pager.PageSize),
                                              new SqlParameter("@PageIndex",pager.PageIndex),
                                              new SqlParameter("@doCount",1),
                                              new SqlParameter("@OrderType",pager.OrderType),
                                              new SqlParameter("@strWhere",pager.StrWhere)
                                            };
                try
                {
                    DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.Connection, CommandType.StoredProcedure, "NewPageShow", parameters);                if (ds.Tables[0].Rows.Count > 0)
                    {
                        return Convert.ToInt32(ds.Tables[0].Rows[0][0]);
                    }
                    else
                    {
                        return 0;
                    }            }
                catch (Exception)
                {                throw;
                }
                finally
                {            }
            }报错了撒.....
    下面是我引用的
    private void BindDataList()
            {
                //--参数列表:
                //--@tblName -- 表名(必添);
                //--@pkid   --主键
                //--@strGetFields -- 需要返回的列(默认所有列);
                //--@fldName -- 排序的字段名(必添);
                //--@PageSize -- 页尺寸(默认每页10条);
                //--@PageIndex -- 页码(默认第1页);
                //--@doCount -- 返回记录总数,非"0"值则返回(用处不大);
                //--@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
                //--@strWhere -- 查询条件(警告:不需要加 where);  
                pager.TblName = "A_001";
                pager.Pkid = "OID_A001";
                pager.StrGetiFelds = "*";
                pager.FldName = "F3_A001 asc,F6_A001";
                AspNetPager1.PageSize = 20;
                pager.PageSize = AspNetPager1.PageSize;
                pager.PageIndex = AspNetPager1.CurrentPageIndex;
                pager.DoCount = 0;
                pager.OrderType = 0;
                pager.StrWhere = " F4_A001='Unit' and F3_A001 in (1,3)" + strQuery;
                NewsList.DataSource = dbll.GetUnitList(pager);
                AspNetPager1.RecordCount = Convert.ToInt32(dbll.GetUnitListCount(pager));
                NewsList.DataBind();
            }我加你了,你也加我关注,可以发私信,帮你看看我给你发私信了
      

  14.   

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    ------           海量数据库分页存储过程             ------
    --参数列表:
    --@tblName -- 表名(必添);
    --@pkid   --主键
    --@strGetFields -- 需要返回的列(默认所有列);
    --@fldName -- 排序的字段名(必添);
    --@PageSize -- 页尺寸(默认每页10条);
    --@PageIndex -- 页码(默认第1页);
    --@doCount -- 返回记录总数,非"0"值则返回(用处不大);
    --@OrderType -- 设置排序类型,非"0"值则降序(默认正序);
    --@strWhere -- 查询条件(警告:不需要加 where);
    --调用示例:exec PageShow TEST,ID,"*" order ,20,1,0,1,"name='DF'"--调用示例:
    --exec PageShow 
    -- @tblName="表名",
    -- @pkid="主键",
    -- @strGetFields="需要返回的列(默认所有列)",
    -- @fldName="排序的字段名",
    -- @PageSize=页尺寸(默认每页10条),
    -- @PageIndex=页码(默认第1页),
    -- @doCount=返回记录总数,非"0"值则返回(用处不大),
    -- @OrderType=设置排序类型,非"0"值则降序(默认正序),
    -- @strWhere="查询条件(警告:不需要加 where)例如StuSex='男'"
    ---------------------------------------------------------
    ALTER PROCEDURE [dbo].[PageShow]
    @doCount  int= 0 ,
    @tblName   varchar(255),
    @strWhere  varchar(1500) = '',
    @pkid varchar(50) = '*',
    @strGetFields varchar(1000) = '*',
    @fldName varchar(255)='',
    @OrderType int = 0,
    @PageSize   int = 10,
    @PageIndex  int = 1AS
    declare @strSQL   varchar(5000)       -- 主语句
    declare @strTmp   varchar(110)        -- 临时变量
    declare @strOrder varchar(400)        -- 排序类型begin tran
    if @doCount != 0
    begin
    if @strWhere !=''
    begin
    set @strSQL = 'select count(['+@pkid+']) as Total from ['+ @tblName +'] where '+@strWhere
    end
    else
    begin
    set @strSQL = 'select count(['+@pkid+']) as Total from [' + @tblName + ']'
    end
    print @Strsql
    end  --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
    else
    begin
    if @OrderType != 0  
    begin
    set @strOrder = ' order by ' + @fldName +' desc'
    --如果@OrderType不是0,就执行降序,这句很重要!
    end
    else
    begin
    set @strOrder = ' order by ' + @fldName +' asc'
    end
    set @strSQL = 
    'select '+ @strGetFields+
    'from
    (
    select *,(row_number() over('+@strOrder +')-1)/'+cast(@PageSize as varchar)+' as rownum  from ' + @tblName +' where '
        +@strWhere +') TblTemp where rownum = '+cast(@PageIndex -1 as varchar)
    end 
    --print @strSQL
    exec (@strSQL)
    if @@error<>0
    rollback
    else
    commit tran谢谢 小当家 这是小当家帮改的 贴出来大家参考
      

  15.   

    declare @doCount  int= 0 , 
    @tblName   varchar(255) ='tt', 
    @strWhere  varchar(1500) = '', 
    @pkid varchar(50) = '*', 
    @strGetFields varchar(1000) = '*', 
    @fldName varchar(255)='od', 
    @OrderType int = 1, 
    @PageSize   int = 10, 
    @PageIndex  int = 2 
      
    --AS
    declare @strSQL   varchar(5000) =''      -- 主语句 
    declare @strTmp   varchar(110)  =''   -- 临时变量 
    declare @strOrder varchar(400) =''-- 排序类型 
      下面是测试出来的SQL语句
    select top 10 *  from [tt] where [od]<(select min([od]) from (select top 10 [od]from [tt] order by [od] desc) as tblTmp) order by [od] desc
    你们觉得这个语句能执行成功吗?