zoukankan      html  css  js  c++  java
  • ORDER BY 子句在子查询和公用表表达式中无效的一种解决办法使用表变量

    很经常我们都要在sql中拼凑字符串,如果需要的评凑的目标字符串的来源都已经在一个表中,那很简单,我们只要写个类似的语句,就可以搞定。
    declare  @Va1 varchar(500);
    set @Va1='';
    select @Va1=@Va1+',['+ColumnName+']' 
    from
    ItemColumn
    where year=2008
    and month=1
    order by SortID desc
    print @Va1
    比如输出为:,[总分],[主题检测],[常规检测],[扣分项],[总体评价],[无推诿],[环境设施],[业务能力],[服务规范]

    但是如果我们的数据来源是一个子查询,情况会怎么样呢?
    declare @str varchar(500)
    set @str=''

    --以下写法,会报错
    select @str=@str+Value+';'
    from
    (
        
    select Value,[Order] from dbo.SMS_SpecialConfigData data
        
    join  dbo.SMS_Config co
        
    on co.ItemID=data.ConfigID
        
    where Time='2008-5-12' and OrgCode='GZ/'
        
    order by [Order]
    )
    temp

    --或如下,但又得不到我们想要的结果
    select @str=@str+Value+';'
    from
    (
        
    select Value,[Order] from dbo.SMS_SpecialConfigData data
        
    join  dbo.SMS_Config co
        
    on co.ItemID=data.ConfigID
        
    where Time='2008-5-12' and OrgCode='GZ/'
    )
    temp
    order by [Order]
    上面的第一个sql,执行会报错,错误如下:
    Msg 1033, Level 15, State 1, Line 12
    除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。


    上面的第二个sql,得到的结果有不是我们想要的。

    难道我们就束手待毙?不,我们还有表变量。
    declare @t table
    (
        strs 
    varchar(200)
    )
    declare @str varchar(500)
    set @str=''

    insert into @t
    select Value from dbo.SMS_SpecialConfigData data
    join  dbo.SMS_Config co
    on co.ItemID=data.ConfigID
    where Time='2008-5-12' and OrgCode='GZ/'
    order by [Order]

    select @str=@str+strs+';'
    from @t

    print @str

    ok,讨厌的1033错误消失了,我们要的结果也拿到了。

  • 相关阅读:
    .net破解二(修改dll)
    CLR 的执行模型(2)
    理解数据库的几种键和几个范式
    事务隔离级别如何影响锁
    c#和java中封装字段的不同
    Linux安装AUTOCONF和AUTOMAKE产生的程序的一般步骤
    html锚点使用示例
    webbrowser控件使用时的注意事项
    C#实现单实例运行
    为Exchange 2007 SCC 启用 SCR 副本-供需要的人使用!
  • 原文地址:https://www.cnblogs.com/JoshuaDreaming/p/2050339.html
Copyright © 2011-2022 走看看