Неверный XML в столбце varbinary (max) в SQL Server 2005 - PullRequest
7 голосов
/ 22 сентября 2010

Итак, я получил столбец varbinary(max) в SQL Server 2005, и он полон XML.Несколько записей где-то имеют усеченный XML, поэтому они недействительны.

Это означает, что если я запускаю

SELECT CAST(myVarbinaryColumn as XML) ... 

, он уносит куски.

Как я могу отфильтровать /пропустить недействительный xml?

Когда я сделал подобное с varchar, у которого предположительно есть даты, я мог бы использовать ISDATE(blah) = 1.Так что эквивалентно ISVALIDXML() было бы неплохо.

Пожалуйста, не комментируйте: «В любом случае, почему тип данных XML столбца ...» Это происходило в прошлом, и у меня нет машины времени.

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

Я думаю, что вам лучше всего написать пользовательскую функцию CLR , возможно, используя XmlDocument.Load .В CLR вы можете перехватить ошибку при неудачной загрузке и вернуть соответствующий результат.

EDIT : приведенный ниже код также будет работать, хотя он не так элегантен, как UDFК сожалению, мы не можем использовать TRY / CATCH в UDF.

create procedure dbo.usp_IsValidXML(@XMLCandidate varbinary(max), @Return bit output)
as
begin
    declare @x xml
    begin try
        set @x = cast(@XMLCandidate as xml)
        set @Return = 1
    end try
    begin catch
        set @Return = 0
    end catch
end
go

declare @test1 varbinary(max)
declare @test2 varbinary(max)
set @test1 = cast('<data>asdf</data>' as varbinary(max))
set @test2 = cast('<data>asdf</da' as varbinary(max))

declare @IsValid bit
exec dbo.usp_IsValidXML @test1, @IsValid output
select @IsValid
exec dbo.usp_IsValidXML @test2, @IsValid output
select @IsValid

drop procedure dbo.usp_IsValidXML
1 голос
/ 22 сентября 2010

Хотелось бы мне иметь эту функцию IsValidXML() тоже ..... к сожалению, я не думаю, что есть что-то подобное .....

Просто мысль: можно ли что-нибудь проверить, чтобы отфильтровать недействительный XML?

например. не могли бы вы отфильтровать все те строки, которые не заканчиваются на .....</data> или что-то в этом роде? (учитывая, что вы говорите, что ваш недопустимый XML обычно является усеченным XML, я бы подумал, что закрывающий тег - </data> или любой другой - в этих случаях будет отсутствовать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...