考虑以下 tsql...
create function dbo.wtfunc(@s varchar(50)) returns varchar(10) begin return left(@s, 2); end
GO
select t.* into #test from (
select 'blah' as s union
select 'foo' union
select 'bar'
) t
select * from #test;
declare @s varchar(100);
set @s = '';
select @s = @s + s from #test order by s;
select @s;
set @s = '';
select @s = @s + s from #test order by dbo.wtfunc(s);
select @s;
/* 2005 only*/
select cast((select s+'' from #test order by dbo.wtfunc(s) for xml path('')) as varchar(100))
drop function dbo.wtfunc;
drop table #test;
我已经在 mssql 2000 和 2005 上尝试过,并且在 order by 中使用函数时都不会连接字符串。在 2005 年,for xml path('') 确实可以工作。输出是...
bar
blah
foo
barblahfoo
foo --nothing concatenated?
barblahfoo
我找不到记录此内容的位置。有人可以解释一下为什么这不起作用吗?
编辑:
以下是实际的执行计划。显然排序和计算标量的顺序不同......
最佳答案
这似乎是 known issue with Aggregate Concatenation Queries .
来自链接:
“ANSI SQL-92 规范要求 ORDER BY 子句引用的任何列都与结果集匹配,结果集由 SELECT 列表中存在的列定义。当表达式应用于 ORDER BY 的成员时子句中,结果列不会在 SELECT 列表中公开,从而导致未定义的行为。”
关于sql - tsql 字符串与 select 和 order by 的连接不能与 order by 子句中的函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/982286/