我認爲你最好的選擇是編寫自定義CLR function,或許使用XmlDocument.Load。在CLR中,您可以將錯誤加載到失敗的負載上並返回適當的結果。
編輯:下面的代碼也可以工作,雖然它不如UDF優雅。不幸的是,我們不能在UDF中使用TRY/CATCH。
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
嗯有趣的是,最後的字節總是相同的,所以我可以過濾掉那些不匹配的東西?幸運的是,在這種情況下,xml都使用相同的模式,因此它們都應該有一個匹配的結束根元素 – 2010-09-22 16:33:20