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.)