Det lyder som om du har brug for en version af ISNUMERIC funktion til XML-data.
Desværre findes der ikke en sådan indbygget funktion - så du bliver nødt til at udtænke dit eget alternativ, som der er et par muligheder for:
Hvis dette er en enkeltstående eller lille skalaproces, hvor ydeevnen ikke er kritisk, kan du behandle inputtabellerne en række ad gangen inde i en markør ved at bruge en TRY...CATCH
blok for at håndtere ugyldige kast (utestet):
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, hvis du er fortrolig med .Net-programmering (og det er aktiveret på din server), kan du bruge CLR at oprette din egen IsXML-funktion. .Net-koden behøver ikke være meget mere kompleks end det tredje indlæg på denne tråd .
Ydeevnen af CLR-løsningen er måske ikke så meget bedre end markøren - du skal teste for at fastslå dette.
(En indlysende ting at prøve, som ikke virker, er en skalar-værdi T-SQL-funktion, som forsøger at caste feltet til XML inde i en TRY...CATCH
blok. Men TRY...CATCH
er ikke tilladt i en funktion.)