Zdá se, že potřebujete verzi ISNUMERIC funkce pro data XML.
Žádná taková vestavěná funkce bohužel neexistuje – takže si budete muset vymyslet vlastní alternativu, pro kterou existuje několik možností:
Pokud se jedná o jednorázový proces nebo proces v malém měřítku, pro který není výkon kritický, můžete vstupní tabulky zpracovat jeden řádek po druhém uvnitř kurzoru pomocí TRY...CATCH
blok pro zpracování neplatných přetypování (netestováno):
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
Případně, pokud jste spokojeni s programováním .Net (a je na vašem serveru povoleno), můžete použít CLR k vytvoření vlastní funkce IsXML. Kód .Net by nemusel být o moc složitější než třetí příspěvek v tomto vláknu .
Výkon řešení CLR nemusí být o tolik lepší než výkon kurzoru – to byste museli otestovat.
(Samozřejmá věc, kterou je třeba vyzkoušet, která nefunguje, je skalární funkce T-SQL, která se pokouší přetypovat pole do XML uvnitř TRY...CATCH
blok. Nicméně TRY...CATCH
není povoleno uvnitř funkce.)