Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server:conversione condizionale in linea con XML?

Sembra che tu abbia bisogno di una versione di ISNUMERIC funzione per dati XML.

Purtroppo non esiste una tale funzione integrata, quindi dovrai escogitare la tua alternativa, per la quale ci sono un paio di opzioni:

Se si tratta di un processo unico o su piccola scala per il quale le prestazioni non sono critiche, è possibile elaborare le tabelle di input una riga alla volta all'interno di un cursore, utilizzando un TRY...CATCH blocco per gestire cast non validi (non testato):

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 

In alternativa, se hai dimestichezza con la programmazione .Net (ed è abilitata sul tuo server) puoi utilizzare CLR per creare la tua funzione IsXML. Il codice .Net non dovrebbe essere molto più complesso del terzo post su questo thread .

Le prestazioni della soluzione CLR potrebbero non essere molto migliori del cursore:per stabilirlo è necessario eseguire un test.

(Una cosa ovvia da provare, che non funziona, è una funzione T-SQL scalare che tenta di eseguire il cast del campo in XML all'interno di un TRY...CATCH bloccare. Tuttavia, TRY...CATCH non è consentito all'interno di una funzione.)