Anscheinend benötigen Sie eine Version von ISNUMERIC Funktion für XML-Daten.
Leider gibt es keine solche eingebaute Funktion - also müssen Sie sich Ihre eigene Alternative ausdenken, für die es ein paar Optionen gibt:
Wenn dies ein einmaliger oder kleiner Prozess ist, für den die Leistung nicht kritisch ist, können Sie die Eingabetabellen Zeile für Zeile innerhalb eines Cursors verarbeiten, indem Sie ein TRY...CATCH
verwenden Block zur Behandlung ungültiger Umwandlungen (ungetestet):
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
Wenn Sie mit der .Net-Programmierung vertraut sind (und diese auf Ihrem Server aktiviert ist), können Sie alternativ die CLR um Ihre eigene IsXML-Funktion zu erstellen. Der .Net-Code müsste nicht viel komplexer sein als der dritte Beitrag in diesem Thread .
Die Leistung der CLR-Lösung ist möglicherweise nicht viel besser als die des Cursors - Sie müssten dies testen, um dies festzustellen.
(Ein offensichtlicher Versuch, der nicht funktioniert, ist eine skalare T-SQL-Funktion, die versucht, das Feld innerhalb eines TRY...CATCH
in XML umzuwandeln Block. Jedoch TRY...CATCH
ist innerhalb einer Funktion nicht erlaubt.)