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