【发布时间】:2015-05-21 07:08:00
【问题描述】:
我很困惑。您如何用 ORDER BY 解释变量连接中的这种差异?
declare @tbl table (id int);
insert into @tbl values (1), (2), (3);
declare @msg1 varchar(100) = '', @msg2 varchar(100) = '',
@msg3 varchar(100) = '', @msg4 varchar(100) = '';
select @msg1 = @msg1 + cast(id as varchar) from @tbl
order by id;
select @msg2 = @msg2 + cast(id as varchar) from @tbl
order by id+id;
select @msg3 = @msg3 + cast(id as varchar) from @tbl
order by id+id desc;
select TOP(100) @msg4 = @msg4 + cast(id as varchar) from @tbl
order by id+id;
select
@msg1 as msg1,
@msg2 as msg2,
@msg3 as msg3,
@msg4 as msg4;
结果
msg1 msg2 msg3 msg4
---- ---- ---- ----
123 3 1 123
【问题讨论】:
-
请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”!
-
嗯,看起来像个bug
-
这是一种奇怪的行为,因为做了一些不恰当的事情。不应根据返回多个值的行来分配变量。就个人而言,我认为这应该给出一个错误,但它可能有一个很好的理由不这样做。
-
这早就documented不工作了:“不要在SELECT语句中使用变量来连接值(即计算聚合值)。可能会出现意外的查询结果。这是因为不能保证 SELECT 列表中的所有表达式(包括赋值)对于每个输出行都只执行一次"
-
来自 Damien 的链接,那里链接的知识库文章直接适用于这个问题:support.microsoft.com/en-us/kb/287515。需要注意的是,在 ORDER BY 子句中使用任何运算符或表达式都会导致这种意外行为。
标签: sql sql-server tsql sql-server-2014