Wygląda na to, że potrzebujesz wersji ISNUMERYCZNEJ funkcja dla danych XML.
Niestety taka wbudowana funkcja nie istnieje - więc będziesz musiał wymyślić własną alternatywę, dla której jest kilka opcji:
Jeśli jest to proces jednorazowy lub na małą skalę, dla którego wydajność nie jest krytyczna, możesz przetwarzać tabele wejściowe po jednym wierszu wewnątrz kursora, używając TRY...CATCH
blok do obsługi nieprawidłowych rzutowań (nieprzetestowany):
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
Alternatywnie, jeśli znasz się na programowaniu .Net (i jest ono włączone na twoim serwerze), możesz użyć CLR aby utworzyć własną funkcję IsXML. Kod .Net musiałby być niewiele bardziej złożony niż trzeci post w tym wątku .
Wydajność rozwiązania CLR może nie być dużo lepsza niż kursora - musisz to przetestować.
(Oczywistą rzeczą do wypróbowania, która nie działa, jest funkcja T-SQL o wartościach skalarnych, która próbuje rzutować pole na XML wewnątrz TRY...CATCH
blok. Jednak TRY...CATCH
nie jest dozwolone wewnątrz funkcji.)