测试数据如下:

     Table Course:

      ID        Name

      1          语文

      2          数学

      3          英语

     想要得到的一个数据是:语文,数学,英语

     以为下面的sql语句执行之后可以得到结果,结果错了。

declare @sql varchar(200)
select @sql=isnull(@sql+',','')+Name from Course order by ID
print @sql

  执行的结果为:英语。Course表中的最后一条数据。

    原因:sql server 中 select 变量赋值的机制是将查询结果的最后一条的记录的值赋给变量。order by子句确定了顺序,最后一条记录的值会被赋值给变量,赋值次数为1。而没有order by 子句,就无法确定数据顺序,这样SQL就扫描满足条件的所有记录,每扫描一次就赋值一次,于是赋值的次数为记录集的数量。

     要得到示例的正确的结果,就是将order by 子句去掉。 

declare @sql varchar(200)
select @sql=isnull(@sql+',','')+Name from Course 
print @sql
 posted on 2014-05-17 15:31  会飞的金鱼  阅读(395)  评论(0)    收藏  举报