2011-12-01 31 views
24

Básicamente tengo una columna llamada XML que es del tipo TEXT; esto no se puede cambiar por otra razón, pero me preguntaba cómo podría convertirlo a XML.No se puede convertir TEXTO a XML en SQL Server

Me da un error

de tratamiento de XML: línea 1, 39 caracteres, incapaz de cambiar la codificación

cuando se trata de hacer esto. ¿Hay alguna forma de solucionarlo en formato XML? Estoy realmente atascado en este punto.

datos dentro de la columna:

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

Aquí está el código SQL reparto:

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

Respuesta

45

Su problema es: usted tiene XML con una encoding="utf-16", pero tu columna es una columna no Unicode ......

Suponiendo que no se puede cambiar a cualquiera NTEXT , que tiene que hacer dos anidada CAST para lograr lo que está buscando:

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

en primer lugar, es necesario echar a NTEXT (o NVARCHAR(MAX)), y luego debe convertir ese resultado al XML, antes de poder usarlo.

Consejo: eliminar esas "otras razones" y convertir este tipo de datos a XML si realmente hay que usarla como XML .....

+0

Obteniendo el error 'carácter legal xml' si pruebo este método. SQL Server 2008 R2. ¿Algunas ideas? – Azimuth

+0

@Azimuth: parece una nueva pregunta, ¡y asegúrese de publicar el XML de muestra! –

+0

@marc_s Creo que el problema es con los caracteres de acento en mi cadena XML ... – Azimuth

-1

¿Ha intentado CONVERT en lugar de CAST?

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

Además, consulte la sección "estilos xml" de esta página; que contiene algunas opciones que tiene al convertir xml:

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

+0

No funciona tampoco .... ninguno de los cuatro estilos disponibles funciona, porque la entrada es básicamente Unicode, pero el tipo de datos en el que está almacenado no es Unicode –

+0

Sí, lo has enganchado; un upvote para ti ... – JohnD

25

Debe reemplazar encoding="utf-16"-encoding="utf-8" o ''(blank) y luego realizar su operación.

a. encoding="utf-16" convertir a 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. Sustitución encoding="utf-16" a ''(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 
+0

Ojalá pudiera marcar ambos correctamente, tú y Marc_s tenían métodos que funcionaban muy bien. Yo subí a la tuya sin embargo. ¡Gracias de nuevo! –

+0

Hola @thesandman, gracias por apoyar, también te he votado. Intenté responderle correctamente de varias maneras. Gracias por tu tiempo. –

+4

Casting de ida y vuelta no funcionó para mí, pero eliminar el explícito 'encoding =" UTF-8 "' como se sugiere aquí hizo el truco. – dakab

2

casting variable XML como NTEXT resuelve el problema CAST(CAST (XML AS NTEXT) AS XML).

+0

Esta es una respuesta infravalorada. – DarkKnight

Cuestiones relacionadas