Parece que você precisa de uma versão do ISNUMERIC função para dados XML.
Lamentavelmente, não existe essa função embutida - então você terá que criar sua própria alternativa, para a qual existem algumas opções:
Se este for um processo único ou de pequena escala para o qual o desempenho não é crítico, você pode processar as tabelas de entrada uma linha por vez dentro de um cursor, usando um
TRY...CATCH
block para lidar com lançamentos inválidos (não testados):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
Como alternativa, se você estiver familiarizado com a programação .Net (e ela estiver habilitada em seu servidor), poderá usar o CLR para criar sua própria função IsXML. O código .Net não precisaria ser muito mais complexo do que o terceiro post este tópico a> .
O desempenho da solução CLR pode não ser muito melhor do que o cursor - você precisaria testar para estabelecer isso.
(Uma coisa óbvia para tentar, que não funciona, é uma função T-SQL de valor escalar que tenta converter o campo para XML dentro de um
TRY...CATCH
quadra. No entanto, TRY...CATCH
não é permitido dentro de uma função.)