2

在我们的数据库中,关于翻译的信息存储在一个 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)

这是我们得到的输出:

Lang Text
---- ----------
de   Probenname
pt   Tipo da Amostra
ru   ??? ?????
eo   Testajnomo

正如人们所看到的,西里尔语条目完全混合在一起,而世界语条目已经失去了变音符号。

知道如何修复它吗?

4

1 回答 1

5

您的 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);
于 2013-05-29T14:49:19.713 回答