sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server:conversión condicional en línea con XML?

Parece que necesita una versión de ISNUMERIC función para datos XML.

Lamentablemente, no existe tal función incorporada, por lo que tendrá que idear su propia alternativa, para lo cual hay un par de opciones:

Si se trata de un proceso único o de pequeña escala para el que el rendimiento no es crítico, puede procesar las tablas de entrada una fila a la vez dentro de un cursor, utilizando un TRY...CATCH bloque para manejar conversiones no válidas (no probado):

DECLARE xmlCur CURSOR FOR
SELECT textcol 
FROM inputTable

OPEN xmlCur
DECLARE @string nvarchar(MAX)
DECLARE @xml xml

FETCH NEXT FROM xmlCur into @string

WHILE @@fetch_status = 0
BEGIN
    BEGIN TRY
        SET @xml = CAST(@string AS XML)
        -- Do something with XML
    END TRY
    BEGIN CATCH
        -- log failure/mark source row as invalid
    END CATCH

    FETCH NEXT FROM xmlCur into @string
END

CLOSE xmlCur
DEALLOCATE xmlCur 

Alternativamente, si se siente cómodo con la programación .Net (y está habilitada en su servidor), puede usar CLR para crear su propia función IsXML. El código .Net no debería ser mucho más complejo que la tercera publicación en este hilo .

Es posible que el rendimiento de la solución CLR no sea mucho mejor que el del cursor; deberá realizar una prueba para establecerlo.

(Una cosa obvia para probar, que no funciona, es una función T-SQL de valor escalar que intenta convertir el campo a XML dentro de un TRY...CATCH bloquear. Sin embargo, TRY...CATCH no está permitido dentro de una función.)