首页 新闻 会员 周边 捐助

分页存储过程改成多列排序

0
悬赏园豆:20 [已关闭问题]

     这是我网上找的存储过程,不过排序只能是单列排序,多列排序就出错,@strGetFields 这个参数怎么能传递i_order asc,i_CompanyId desc 这样的句子 而不是只能传递i_CompanyId

-- 获取指定页的数据
            CREATE PROCEDURE pagination3
            @tblName   varchar(255),       -- 表名
            @strGetFields varchar(1000) = '*',  -- 需要返回的列
            @fldName varchar(255)='',      -- 排序的字段名
            @PageSize   int = 10,          -- 页尺寸
            @PageIndex  int = 1,           -- 页码
            @doCount  bit = 0,   -- 返回记录总数, 非 0 值则返回
            @OrderType bit = 0,  -- 设置排序类型, 非 0 值则降序
            @strWhere  varchar(1500) = ''  -- 查询条件 (注意: 不要加 where)
            AS
            declare @strSQL   varchar(5000)       -- 主语句
            declare @strTmp   varchar(110)        -- 临时变量
            declare @strOrder varchar(400)        -- 排序类型
            if @doCount != 0
            begin
            if @strWhere !=''
            set @strSQL = "select count(*) as Total from [" + @tblName + "] where "+@strWhere
            else
            set @strSQL = "select count(*) as Total from [" + @tblName + "]"
            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
            exec (@strSQL)
            GO

问题补充: 就是想满足这两条查询 /*----根据行业大类查询公司所有列表-----*/ CREATE PROCEDURE [dbo].[ComListByBigId] @i_BigId int AS select i_CompanyId,v_Name from tab_Company where i_Check=1 and i_BigId=@i_BigId order by i_IsVip desc,i_Recommend desc, i_order asc,i_CompanyId desc GO 以及还想做个下面这样的多表连接 /*----根据产品小类查询产品所有列表-----*/ CREATE PROCEDURE [dbo].[ProListBySId] @i_SId int AS select tab_Product.i_Id as i_Id,tab_Product.v_Name as Pv_Name,tab_Product.v_Picture,d_ReleaseDate,tab_ProductType.v_Name as PTv_Name,tab_Product.i_CompanyId,tab_Company.v_Name as Cv_Name from tab_Company,tab_Product,tab_ProductType where tab_Company. i_Check=1 and tab_Product.i_Check=1 and i_IsVip in (1,2,3) and tab_Product.i_SId=@i_SId and tab_Company.i_CompanyId=tab_Product.i_CompanyId and tab_Product.i_ProductType=tab_ProductType.i_Id order by i_IsVip desc,tab_Product.i_CompanyId desc,tab_Company.i_Recommend desc,tab_Company.i_order asc,tab_Product.i_Id desc GO
爱好学习的人的主页 爱好学习的人 | 初学一级 | 园豆:2
提问于:2010-01-11 11:56
< >
分享
其他回答(1)
0

……,这个代码看起来实在是很头晕,

楼主说下需求,我帮你重新 写个吧。

齐.net | 园豆:1421 (小虾三级) | 2010-01-11 12:06
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

如果是不固定列的话你只能是用固定格式的字符串来排序,类似 “字段,字段,字段”的格式,在存储过程中用函数分割。

邢少 | 园豆:10926 (专家六级) | 2010-01-11 14:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册