Подтвердить что ты не робот

Невозможно передать TEXT в XML в SQL Server

В основном у меня есть столбец с именем 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
4b9b3361

Ответ 1

Ваша проблема: у вас есть XML с encoding="utf-16", но ваш столбец не является столбцом Unicode...

Предполагая, что вы не можете изменить его на 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.....

Ответ 2

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

а. Преобразование 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

б. Замена 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

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

Ответ 4

Вы пробовали 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