Het klinkt alsof je een versie van de ISNUMERIC
Helaas bestaat zo'n ingebouwde functie niet - dus je zult je eigen alternatief moeten bedenken, waarvoor er een aantal opties zijn:
Als dit een eenmalig of kleinschalig proces is waarvoor de prestaties niet van cruciaal belang zijn, kunt u de invoertabellen rij voor rij binnen een cursor verwerken, met behulp van een TRY...CATCH
blok om ongeldige casts af te handelen (niet getest):
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
Als alternatief, als u vertrouwd bent met .Net-programmering (en het is ingeschakeld op uw server), kunt u de CLR om uw eigen IsXML-functie te maken. De .Net-code zou niet veel complexer moeten zijn dan de derde post op deze thread .
De prestaties van de CLR-oplossing zijn misschien niet zo veel beter dan de cursor - je zou moeten testen om dit vast te stellen.
(Een voor de hand liggend ding om te proberen, wat niet werkt, is een scalaire waarde T-SQL-functie die probeert het veld naar XML te casten in een TRY...CATCH
blok. Echter, TRY...CATCH
is niet toegestaan binnen een functie.)