Ale*_*kin 2 xml sql-server unicode
在我们的数据库中,有关翻译的信息存储在XML列中,我们使用数据类型的.value()
函数提取它xml
.我们使用nvarchar(100)
目标数据类型,但转换后值会被破坏.
以下是示例代码:
DECLARE @x Xml
SET @x =
'<TRANSLATIONS>
<TRANSLATION Lang="de">Probenname</TRANSLATION>
<TRANSLATION Lang="pt">Tipo da Amostra</TRANSLATION>
<TRANSLATION Lang="ru">??? ?????</TRANSLATION>
<TRANSLATION Lang="eo">Testa?nomo</TRANSLATION>
</TRANSLATIONS>'
SELECT TR.lentry.value('@Lang','varchar(2)') AS Lang,
TR.lentry.value('.','nvarchar(100)') AS Text
FROM @x.nodes('/TRANSLATIONS/TRANSLATION') AS TR(lentry)
Run Code Online (Sandbox Code Playgroud)
这是我们得到的输出:
Lang Text
---- ----------
de Probenname
pt Tipo da Amostra
ru ??? ?????
eo Testajnomo
Run Code Online (Sandbox Code Playgroud)
正如人们可能看到的那样,西里尔语词条完全混杂在一起,而世界语词条则失去了变音符号.
知道如何修复它吗?
您的xml常量是varchar,因此在解析之前数据会丢失.添加N前缀以使其成为varchar
DECLARE @x Xml
-- broke
SET @x =
'<TRANSLATIONS>
<TRANSLATION Lang="de">Probenname</TRANSLATION>
<TRANSLATION Lang="pt">Tipo da Amostra</TRANSLATION>
<TRANSLATION Lang="ru">??? ?????</TRANSLATION>
<TRANSLATION Lang="eo">Testa?nomo</TRANSLATION>
</TRANSLATIONS>';
SELECT @x;
-- fixed
SET @x =
N'<TRANSLATIONS>
<TRANSLATION Lang="de">Probenname</TRANSLATION>
<TRANSLATION Lang="pt">Tipo da Amostra</TRANSLATION>
<TRANSLATION Lang="ru">??? ?????</TRANSLATION>
<TRANSLATION Lang="eo">Testa?nomo</TRANSLATION>
</TRANSLATIONS>';
SELECT @x;
SELECT TR.lentry.value('@Lang','varchar(2)') AS Lang,
TR.lentry.value('.','nvarchar(100)') AS Text
FROM @x.nodes('/TRANSLATIONS/TRANSLATION') AS TR(lentry);
Run Code Online (Sandbox Code Playgroud)