zoukankan      html  css  js  c++  java
  • [SQL Server]ORDER BY的问题

    今天在写一个SQL 语句的时候,发现一个怪异的问题,如果我加上 Order by ,返回的就不是我所需要的数据。如果不加,返回的数据结构才是我所需要的。极度郁闷。咨询了一下 邹建 ,他也碰到过很多关于 Order by 的问题。并且他自己写了一个范例 SQL 来演示这个问题。由于我那个问题SQL涉及到表和视图,比较麻烦,下面就用 邹建 写的那个范例来演示这个 Bug。他这个不涉及到表,有SqL 环境的都可以测试一下。

    下面是演示这个 Bug 的SQL 语句。

    --定义变量
    declare @s varchar(30)

    --生成字符串
    set @s=''
    select @s=@s+',['+convert(varchar( 6),dateadd(month,id,'2004-01-01'),112)+']'
    from(
     select id=0 union all select 1 union all select 2
    ) a
    order by convert(varchar( 6) ,dateadd(month,id,'2004-01-01'),112)

    --显示结果
    select @s

    /*--测试结果,显示不正确,如果去掉order by就正确了.
                                  
    ------------------------------
    ,[200403]

    (所影响的行数为 1 行)
    --*/

    回复:



    --定义变量
    declare @s varchar(30)

    --生成字符串
    set @s=''
    select @s=@s+',['+convert(varchar( 6),dateadd(month,id,'2004-01-01'),112)+']'
    from(
    select id=0 union all select 1 union all select 2
    ) a
    order by id desc
    --order by convert(varchar( 6) ,dateadd(month,id,'2004-01-01'),112)

    --显示结果
    select @s


    这个不应该是sql server的bug,作为sql server内部对动态的SQL的语法优化器会将convert(varchar( 6) ,dateadd(month,id,'2004-01-01'),112)
    内存中在一个内存地址,所以在最后convert(varchar( 6) ,dateadd(month,id,'2004-01-01'),112)
    进行sort时这个内存中只有一个值,所以会有这样的情况。
    你试试看order by id就可以了:-)
  • 相关阅读:
    Apache Commons介绍(转载)
    MYSQL Nested Join Optimization
    Mysql Nested-Loop Join Algorithms
    jquery eval解析JSON中的注意点介绍
    jspSmartUpload上传下载使用例子
    JavaWeb基础
    (一)Model的产生及处理
    SpringMVC注解@RequestParam全面解析
    @ModelAttribute使用详解
    Spring中Controller和RequestMapping的详解
  • 原文地址:https://www.cnblogs.com/huqingyu/p/218598.html
Copyright © 2011-2022 走看看