首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

多个排序条件报错?存储过程的事情

2013-11-13 
多个排序条件报错?存储过程的事儿?今天绑定列表时候需要多一个字段作为排序条件,报错了说字段无效,后来发

多个排序条件报错?存储过程的事儿?
今天绑定列表时候需要多一个字段作为排序条件,报错了说字段无效,后来发现存储过程不支持多条件排序,下面贴出来求各路大神看看如果才能支持多个条件的排序呢?就剩这点分了5555

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 = 1

AS
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






  


多条件排序?SQL?存储过程?


[解决办法]

引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

 在--以下代码赋予了@strSQL以真正执行的SQL代码
没有给查询结果的列取别名        
@strTmp + '(['+ @fldName + ']) from (select top ' 改成
 @strTmp + '(['+ @fldName + ']) '+@fldName +'from (select top '  
后面如果还有中间结果集的话也加上别名   
应该不是这里的事情,感觉还是1楼说的那里有问题!


把存储过程中的这个:

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


我加你了,你也加我关注,可以发私信,帮你看看


我给你发私信了

热点排行