Рассмотрим следующее 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, и оба не объединяют строку при использовании функции в порядке. В 2005 году путь for xml ('') работает. Выходной сигнал ...
bar
blah
foo
barblahfoo
foo --nothing concatenated?
barblahfoo
Я не могу найти, где это задокументировано. Может кто-нибудь пролить свет на то, почему это не работает?
EDIT:
Вот фактические планы выполнения. Очевидно, что сортировка и вычисление скаляров не в том же порядке ...