与FOR XML更改编码连接

Rad*_*hiu 2 xml t-sql sql-server

我有一个查询,它将一个数字转换为一组ASCII字符,然后尝试将它们连接成一个字符串:

declare @number int = 651854564

;with cte as (
select @number prev_nr
    , cast(char(@number % 256) as nvarchar(100)) nextchar
union all
select prev_nr / 256    prev_nr
    , cast(char((prev_nr / 256) % 256) as nvarchar(100)) nextchar
from cte
where prev_nr <> 0)
select 
    cast(nextchar + '' as nvarchar(100))
from cte
where prev_nr <> 0
for xml path ('');
Run Code Online (Sandbox Code Playgroud)

将上述数字拆分为单个字符所产生的字符为:

characters
ä
‚
Ú
&
Run Code Online (Sandbox Code Playgroud)

但是当尝试将它们连接起来时,FOR XML它们会改变编码,以便最终&转换并连接成最终结果,即:ä‚Ú&amp;

我该如何解决这个问题,以便获得正确的编码并生成ä‚Ú&结果?

我已尝试将所有内容转换为nvarchar(100)但我觉得这没有任何影响(实际上几乎与编码无关 - 或者至少在我的场景中没有用).

我也尝试了众所周知的STUFFFOR XML,但没有真正的帮助.

Sql*_*Zim 5

查询中使用该type指令for xml

试试这个:

declare @number int = 651854564

;with cte as (
select @number prev_nr
    , cast(char(@number % 256) as nvarchar(100)) nextchar
union all
select prev_nr / 256    prev_nr
    , cast(char((prev_nr / 256) % 256) as nvarchar(100)) nextchar
from cte
where prev_nr <> 0
)

select (select 
    cast(nextchar + '' as nvarchar(100))
from cte
where prev_nr <> 0
for xml path (''), type).value('.','nvarchar(max)')
Run Code Online (Sandbox Code Playgroud)

rextester演示:http://rextester.com/QRUE46541

收益: ä‚Ú&