sql - tsql 字符串与 select 和 order by 的连接不能与 order by 子句中的函数一起使用?

标签 sql sql-server tsql

考虑以下 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

我找不到记录此内容的位置。有人可以解释一下为什么这不起作用吗?

编辑:

以下是实际的执行计划。显然排序和计算标量的顺序不同......

alt text alt text

最佳答案

这似乎是 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/

相关文章:

sql-server - 如何从字符串 id 中选择 id 所在的数据?

php - 如何获取自动递增变量并将其插入到插入查询中

sql - 根据另一列从列中检索值

sql - 检查值是正还是负

sql - 使用列名称取消透视

sql - 如何在 SQL SERVER 中的两个不同符号前后有条件地使用子字符串

sql-server - SSRS 报告中的数据集过滤 - 如何隐藏仅包含 0 的记录

tsql - 无法绑定(bind)多部分标识符 "#tmpFullname.Item"。”

MySQL排序时提供排名数?

mysql - 在 LIMIT 1 的查询中使用依赖查询是一个错误的操作吗?