Изглежда, че имате нужда от версия на ISNUMERIC функция за XML данни.
За съжаление не съществува такава вградена функция - така че ще трябва да измислите своя собствена алтернатива, за която има няколко опции:
Ако това е еднократен или малък процес, за който производителността не е критична, можете да обработвате входните таблици ред по ред в курсора, като използвате TRY...CATCH
блок за обработка на невалидни кастинги (нетествани):
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
Като алтернатива, ако сте доволни от програмирането в .Net (и то е активирано на вашия сървър), можете да използвате CLR за да създадете своя собствена IsXML функция. Кодът на .Net не трябва да е много по-сложен от третата публикация в тази тема .
Производителността на CLR решението може да не е много по-добра от тази на курсора - ще трябва да тествате, за да установите това.
(Очевидно нещо, което трябва да опитате, но което не работи, е T-SQL функция със скаларни стойности, която се опитва да прехвърли полето към XML вътре в TRY...CATCH
блок. Въпреки това, TRY...CATCH
не е разрешено във функция.)