Sepertinya Anda memerlukan versi ISNUMERIC fungsi untuk data XML.
Sayangnya tidak ada fungsi bawaan seperti itu - jadi Anda harus memikirkan alternatif Anda sendiri, yang ada beberapa opsi:
Jika ini adalah proses satu kali atau skala kecil yang kinerjanya tidak terlalu penting, Anda dapat memproses tabel input satu baris pada satu waktu di dalam kursor, menggunakan TRY...CATCH
blok untuk menangani pemeran yang tidak valid (belum diuji):
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
Atau, jika Anda merasa nyaman dengan pemrograman .Net (dan itu diaktifkan di server Anda), Anda dapat menggunakan CLR untuk membuat fungsi IsXML Anda sendiri. Kode .Net harus tidak lebih kompleks daripada postingan ketiga di utas ini .
Kinerja solusi CLR mungkin tidak jauh lebih baik daripada kursor - Anda perlu menguji untuk menetapkan ini.
(Hal yang jelas untuk dicoba, yang tidak berhasil, adalah fungsi T-SQL bernilai skalar yang mencoba mentransmisikan bidang ke XML di dalam TRY...CATCH
memblokir. Namun, TRY...CATCH
tidak diizinkan di dalam suatu fungsi.)