代码之家  ›  专栏  ›  技术社区  ›  hollystyles

SQL Server 2005中varbinary(max)列中的XML无效

  •  7
  • hollystyles  · 技术社区  · 16 年前

    varbinary(max) 列,它充满了XML。有些记录截断了XML,所以它们是无效的。

    SELECT CAST(myVarbinaryColumn as XML) ... 
    

    它吹大块。

    如何过滤/跳过无效的xml?

    当我用一个应该有日期的varchar做了类似的事情时 ISDATE(blah) = 1 . 所以是等价物 ISVALIDXML() 那就好了。

    请不要评论“为什么列XML数据类型不是…”这发生在过去,我没有时间机器。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Joe Stefanelli    16 年前

    我想你最好的办法是写一个自定义的 CLR function XmlDocument.Load . 在CLR中,您可以捕获失败加载时的错误并返回适当的结果。

    编辑

    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
    
        2
  •  1
  •   marc_s MisterSmith    16 年前

    我希望我有那个 IsValidXML() 功能也是。。。。。不幸的是,我不认为有这样的事情。。。。。

    只是想一想:有没有什么东西可以用来过滤掉无效的XML??

    你能过滤掉所有不以结尾的字符串吗 .....</data> 或者类似的东西??(看到您说的无效XML通常是截断的XML,所以我认为结束标记- </data>