TSQL xml Unicode встроенное назначение не удается - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть следующий xml:

<?xml version="1.0" encoding="utf-8"?>
<products>
        <product>
              <ProductDescription><![CDATA[SOMETHIN''WHATEVER]]></ProductDescription>
        </product>


        <product>
              <ProductDescription><![CDATA[TYPICAL_TEXT ΜΑΣΚΑΡΑ]]></ProductDescription>
            </product>
</products>

, который я хочу сделать в столбцы.Обыскав, я пришел к следующему решению:

declare @input XML='copy-paste-my-xml'


SELECT 
Item.value('(ProductDescription)[1]', 'nvarchar(max)') as ProductDescription
from
@input.nodes('//product') AS T(Item)

Выполнение запроса приводит к этой ошибке:

Сообщение 9420, Уровень 16, Состояние 1, Разбор XML строки 1:строка 9, символ 57, недопустимый символ xml

Место, обозначенное ошибкой, - это место, где начинается первый символ Unicode: ΜΑΣΚΑΡΑ.Я пришел к выводу, потому что удаление части Unicode делает запрос выполняется успешно.Но я читал, что XML поддерживает Unicode.Я также пытался использовать N ', но я получил:

Сообщение 9402, уровень 16, состояние 1, строка 1 Синтаксический анализ XML: строка 1, символ 38, невозможно переключить кодировку

Что я должен сделать, чтобы получить значение Unicode?

1 Ответ

0 голосов
/ 19 декабря 2018

Проблема здесь состоит из двух частей:

  1. Вы используете декларацию xml, заявляющую, что XML кодируется в utf-8.В SQL-сервере это устарело.На этом уровне поддержки utf-8 нет.Так что XML - это лжец.
  2. Вы используете литерал типа 'Some XML here', который неявно имеет тип CHAR / VARCHAR.Эта строка с однобайтовым кодированием является расширенной ASCII с очень ограниченной поддержкой иностранных символов (использует сопоставление символов посредством сопоставления).Вы должны использовать литерал с ведущим N, чтобы сделать его NCHAR/NVARCHAR с широким диапазоном поддержки юникода (а точнее: UCS-2).

InВ следующем примере я использую ваш XML без объявления.Лучше всего это пропустить, поскольку это бессмысленно в SQL-сервере.Но в качестве альтернативы вы можете изменить utf-8 на utf-16 или ucs-2:

declare @input XML=
N'<products>
        <product>
              <ProductDescription><![CDATA[SOMETHIN''WHATEVER]]></ProductDescription>
        </product>


        <product>
              <ProductDescription><![CDATA[TYPICAL_TEXT ΜΑΣΚΑΡΑ]]></ProductDescription>
            </product>
</products>';


SELECT 
Item.value('(ProductDescription)[1]', 'nvarchar(max)') as ProductDescription
from
@input.nodes('//product') AS T(Item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...