2011-04-20 26 views
5

Tengo más de un millón de filas en una base de datos SQLServer2005, con una columna de texto que contiene cadenas XML. Quiero enviar el texto al tipo de datos XML para extraer partes de los datos.Safe-casting text to XML

El problema es que hay algunos registros que arrojarán errores durante la conversión (es decir, XML no válido). ¿Cómo puedo ignorar estos errores para que todo el XML válido se emita correctamente y XML no válido se almacena como nulo?

Respuesta

5

Una vez en una situación similar agregué la columna XML a la misma tabla que la columna Texto. Luego utilicé un proceso RBAR para intentar copiar el "XML" de la columna de texto a la nueva columna XML (no el más rápido, pero confirma las escrituras individuales y esto será algo único, ¿no?). Esto supone que su tabla tiene un PK de un tipo de datos int.

declare @minid int, @maxid int; 

select @minid=min(ID), @maxid=max(ID) from XMLTable; 

while @minid <= @maxid 
begin 

begin try 

update t 
set XMLColumn = cast(TextColumn as XML) 
from XMLTable t 
where ID = @minid; 

set @minid = @minid+1 

end try 
begin catch 

print('XML transform failed on record ID:'+cast(@minid as varchar)) 

--advance to the next record 
set @minid = @minid+1 
end catch 


end 
+0

Después de publicar, se me ocurrió ingenio h algo muy similar con los cursores (aún RBAR - buen término). Aún así, probé tu código y ¡funciona genial! Una buena forma de evitar los cursores y los mensajes de falla son un buen toque. Gracias –

-1

otra posibilidad deberá estar escribiendo un ensamblado .NET que carga el XML en xmlDocument, devuelve un BOOL si el XML es válido por lo que en realidad se puede analizar en SQL

2

Sé que esto es SQL Server 2012+ funcionalidad pero ya que esta cuestión es la parte superior Google resultado aquí está:

SELECT 
COALESCE(TRY_CONVERT(xml, '</bad xml>'), 'InvalidXML') 

Usted puede encontrar la documentación aquí: TRY_CONVERT (Transact-SQL)