Невозможно передать 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
Ответы
Ответ 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