Невозможно преобразовать TEXT в XML в SQL Server. - PullRequest
31 голосов
/ 01 декабря 2011

В основном у меня есть столбец с именем XML, который имеет тип TEXT; это не может быть изменено по другой причине, но мне было интересно, как я могу преобразовать его в XML.

Это дает мне ошибку

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

при попытке сделать это. Есть ли что-нибудь вокруг, чтобы все еще отформатировать его в XML? Я действительно застрял в этой точке.

Данные в столбце:

<?xml version="1.0" encoding="utf-16"?>
<Record>
     <UserGuid>c624a356-9f18-403c-b404-790e79034c7d</UserGuid>
</Record>

Вот приведенный код SQL:

SELECT CAST(XML AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
FROM tbl_Module_RequestForms_Items

Ответы [ 5 ]

52 голосов
/ 01 декабря 2011

Ваша проблема: у вас есть XML с encoding="utf-16", но ваш столбец - это столбец не в Юникоде ......

Предполагая, что вы также не можете изменить его на NTEXT, вам нужно сделать два вложенных CAST, чтобы достичь того, что вы ищете:

SELECT 
    CAST(CAST(XML AS NTEXT) AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
FROM 
    tbl_Module_RequestForms_Items

Сначала вам нужно привести к NTEXT (или NVARCHAR(MAX)), а затем вы должны привести этот результат к XML, прежде чем сможете его использовать.

Совет: удалите эти "другие причины" и преобразуйте это в XML тип данных, если вам действительно нужно использовать его в качестве XML .....

32 голосов
/ 01 декабря 2011

Вы должны заменить encoding="utf-16" на encoding="utf-8" или ''(blank) и затем выполнить свою операцию.

a.Преобразование encoding="utf-16" в encoding="utf-8"

SELECT 
  CAST(
    REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', 'encoding="utf-8"')
  AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid
from tbl_Module_RequestForms_Items

b.Замена encoding="utf-16" на ''(blank)

SELECT 
  CAST(
    REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', '')
  AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid
from tbl_Module_RequestForms_Items
3 голосов
/ 03 февраля 2014

Преобразование XML-переменной в NTEXT решает проблему CAST(CAST (XML AS NTEXT) AS XML).

0 голосов
/ 03 ноября 2018

Замена encoding = "utf-8" на encoding = "utf-16" работала для.:)

0 голосов
/ 01 декабря 2011

Вы пробовали CONVERT вместо CAST?

SELECT CONVERT(XML, @xml).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
from tbl_Module_RequestForms_Items

Кроме того, ознакомьтесь с разделом "xml styles" на этой странице;он содержит некоторые параметры, которые есть у вас при конвертации xml:

http://msdn.microsoft.com/en-us/library/ms187928.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...