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就可以了:-)
  • 相关阅读:
    QTP 参数化
    功能自动化测试流程
    Oracle客户端安装及配置
    描述性编程与对象库编程的对比
    Java用Scanner类获取用户输入
    Java入门的程序汇总
    Java入门学习知识点汇总
    Java最常用的变量定义汇总
    eclipse对Java程序的移植
    JavaScript关闭窗口的同时打开新页面的方法
  • 原文地址:https://www.cnblogs.com/huqingyu/p/218598.html
Copyright © 2011-2022 走看看