Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server:conversão condicional em linha com XML?


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