Det låter som att du behöver en version av ISNUMERIC funktion för XML-data.
Tyvärr finns ingen sådan inbyggd funktion - så du måste ta fram ditt eget alternativ, för vilket det finns ett par alternativ:
Om detta är en engångs- eller småskalig process för vilken prestanda inte är avgörande, kan du bearbeta inmatningstabellerna en rad i taget inuti en markör, med hjälp av en TRY...CATCH
block för att hantera ogiltiga kast (otestad):
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
Alternativt, om du är bekväm med .Net-programmering (och den är aktiverad på din server) kan du använda CLR för att skapa din egen IsXML-funktion. .Net-koden behöver inte vara mycket mer komplex än det tredje inlägget i den här tråden a> .
Prestandan för CLR-lösningen kanske inte är så mycket bättre än markören - du måste testa för att fastställa detta.
(En självklar sak att prova, som inte fungerar, är en skalärt värderad T-SQL-funktion som försöker casta fältet till XML i en TRY...CATCH
blockera. Men TRY...CATCH
är inte tillåtet i en funktion.)