为啥排序规则不适用于子查询中的 xml 路径?

Posted

技术标签:

【中文标题】为啥排序规则不适用于子查询中的 xml 路径?【英文标题】:Why collation doesn't work with for xml path in subquery?为什么排序规则不适用于子查询中的 xml 路径? 【发布时间】:2020-06-29 12:03:50 【问题描述】:

我通常使用collate SQL_Latin1_General_CP1251_CI_AS 来删除这样的重音符号(变音符号)。

select ('ěščřžýáíé' + '-' + (select 'ěščřžýáíé')) collate SQL_Latin1_General_CP1251_CI_AS

escrzyaie-escrzyaie

不幸的是,在其中一个搜索查询停止工作后,我发现在子查询中与 for xml path 结合使用时会忽略排序规则。

select ('ěščřžýáíé' + '-' + (select 'ěščřžýáíé' for xml path(''))) 
       collate SQL_Latin1_General_CP1251_CI_AS

ěščřžýáíé-ěščřžýáíé

可以通过分别对每个部分使用排序规则来解决此问题,但我想知道为什么它在前面的示例中不起作用。

select ('ěščřžýáíé' collate SQL_Latin1_General_CP1251_CI_AS + '-' 
     + (select 'ěščřžýáíé' collate SQL_Latin1_General_CP1251_CI_AS for xml path('')))

escrzyaie-escrzyaie

【问题讨论】:

【参考方案1】:

在连接之前将其转换为 varchar

     select ('ěščřžýáíé' + '-' 
             + cast((select 'ěščřžýáíé' for xml path('')) as varchar(max))) 
               collate SQL_Latin1_General_CP1251_CI_AS

【讨论】:

您能解释一下为什么需要这样做吗?我想了解为什么没有它就行不通。

以上是关于为啥排序规则不适用于子查询中的 xml 路径?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这种方法不适用于通过反应可视化快速排序?

mongodb排序规则不适用于facet阶段的insinde聚合

为啥多变量赋值适用于快速排序算法但不适用于逐行赋值?

自动排序不适用于一张 Google 表格中的多张表格

MySQL 查询不适用于 NOT IN

冒泡排序不适用于对 C++ 中的动态对象数组进行排序