Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server :conversion conditionnelle en ligne avec XML ?

Il semble que vous ayez besoin d'une version de ISNUMERIC fonction pour les données XML.

Malheureusement, aucune fonction intégrée de ce type n'existe - vous devrez donc concevoir votre propre alternative, pour laquelle il existe plusieurs options :

S'il s'agit d'un processus ponctuel ou à petite échelle pour lequel les performances ne sont pas critiques, vous pouvez traiter les tables d'entrée une ligne à la fois à l'intérieur d'un curseur, en utilisant un TRY...CATCH bloc pour gérer les conversions invalides (non testées) :

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 

Alternativement, si vous êtes à l'aise avec la programmation .Net (et qu'elle est activée sur votre serveur), vous pouvez utiliser le CLR pour créer votre propre fonction IsXML. Le code .Net ne devrait pas être beaucoup plus complexe que le troisième message sur ce fil .

Les performances de la solution CLR ne sont peut-être pas bien meilleures que celles du curseur - vous devrez tester pour l'établir.

(Une chose évidente à essayer, qui ne fonctionne pas, est une fonction T-SQL à valeur scalaire qui tente de convertir le champ en XML dans un TRY...CATCH bloquer. Cependant, TRY...CATCH n'est pas autorisé dans une fonction.)