Преобразование строки в xml и вставка Sql Server

у нас есть таблица базы данных SQL Server 2008 R2 с XML, хранящейся в столбце VARCHAR тип данных.

теперь мне нужно извлечь некоторые элементы xml.

поэтому я хочу сначала преобразовать xml, хранящийся как VARCHAR тип данных, в xml, хранящийся как xml тип данных.

пример :

Таблица A

Id(int) , ProductXML (varchar(max))

Таблица B

Id(int), ProductXML(XML)

я хочу, чтобы преобразовать ProductXML С Table A в тип данных XML и вставить в Table B.

я попытался с помощью CAST() и CONVERT() функции, как показано ниже :

insert into TableB (ProductXML)
select CAST(ProductXML as XML) from TableA;

аналогично пытался конвертировать, но я получаю ошибку

синтаксический анализ XML: невозможно переключить кодировку

есть ли способ преобразовать varchar записи в таблице в записи XML ?

о XML: он огромен со многими узлами, и его структура динамически меняется.

пример : Одна строка может иметь и запись XML для 1 продукта, а другая строка может иметь запись xml для нескольких продуктов.

2 ответов


дать нам образец вашего XML как все это будет работать:

CONVERT(XML, '<root><child/></root>')
CONVERT(XML, '<root>          <child/>         </root>', 1)
CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>'  AS XML)

Также вам, возможно, придется сначала бросить его в nvarchar или varbinary (из документации Microsoft):

вы можете проанализировать любой из строковых типов данных SQL Server ,таких как[n] [var]char, [N]text, varbinary и image,В тип данных xml путем приведения (приведения) или преобразования (преобразования) строки В тип данных xml. Нетипизированный XML проверяется, чтобы подтвердить, что он хорошо сформирован. Если есть связанная схема с типом XML, также выполняется проверка. Дополнительные сведения см. В разделе сравнение типизированного и Нетипизированного XML.

XML-документы могут быть закодированы с различными кодировками (например, UTF-8, UTF-16, windows-1252). Ниже описываются правила взаимодействия типов строк и двоичных источников с кодировкой XML-документа и поведение анализатора.

поскольку nvarchar предполагает двухбайтовую кодировку unicode, такую как UTF-16 или UCS-2, синтаксический анализатор XML будет обрабатывать строку значение двух байт в кодировке Юникод, XML-документ или фрагмент. Это означает, что XML-документ должен быть закодирован в двухбайтовой кодировке Unicode, а также совместим с типом данных источника. Кодированный XML-документ UTF-16 может иметь метку порядка байтов UTF-16 (BOM), но это не обязательно, поскольку контекст исходного типа дает понять, что это может быть только двухбайтовый кодированный документ Unicode.

содержимое строки varchar обрабатывается как ОДНОБАЙТОВЫЙ кодированный XML документ / фрагмент синтаксическим анализатором XML. Поскольку исходная строка varchar имеет связанную кодовую страницу, синтаксический анализатор будет использовать эту кодовую страницу для кодирования, если в самом XML не указано явное кодирование, если экземпляр XML имеет спецификацию или объявление кодировки, спецификация или объявление должны быть согласованы с кодовой страницей, иначе анализатор сообщит об ошибке.

содержимое varbinary обрабатывается как поток codepoint, который передается непосредственно синтаксическому анализатору XML. Таким образом, XML-документ или фрагмент должен предоставить встроенную спецификацию или другую информацию о кодировке. Парсер будет смотреть только на поток, чтобы определить кодировку. Это означает, что XML в кодировке UTF-16 должен предоставлять спецификацию UTF-16, а экземпляр без спецификации и без кодировки объявления будет интерпретироваться как UTF-8.

Если кодировка XML-документа не известна заранее и данные передаются как строковые или двоичные данные вместо XML-данных перед приведением в XML, это рекомендуется рассматривать данные как varbinary. Например, при чтении данных из XML-файла с помощью OpenRowset () следует указать данные для чтения как значение varbinary(max):

select CAST(x as XML) 
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)

SQL Server внутренне представляет XML в эффективном двоичном представлении, использующем кодировку UTF-16. Пользовательская кодировка не сохраняется, но является в процессе разбора.

устранение:

CONVERT(XML, CONVERT(NVARCHAR(max), ProductXML))

это сработало для меня:

select CAST(REPLACE(CAST(column3 AS NVARCHAR(MAX)),'utf-8','utf-16') AS XML) from table