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就可以了:-)
  • 相关阅读:
    双向链表
    单链表实例+反转
    const,static,volatile
    html基础知识
    linux知识
    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) D. Delivery Delays (二分+最短路+DP)
    2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018) A. Altruistic Amphibians (DP)
    BZOJ 1453 (线段树+并查集)
    HDU 5634 (线段树)
    BZOJ 2124 (线段树 + hash)
  • 原文地址:https://www.cnblogs.com/huqingyu/p/218598.html
Copyright © 2011-2022 走看看