Похоже, вам нужна версия функции 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
недопустимо внутри функция.) * * тысяча двадцать-одна