将varchar转换为XML并解析XML失败

将varchar转换为XML并解析XML失败,xml,tsql,function,parsing,Xml,Tsql,Function,Parsing,我试图设计一个查询来搜索EMR数据库中的审计日志。问题是审计信息存储在一个varchar列中,有时它只是一个文本描述,我不关心发生了什么,有时它包含有效的XML,我知道这是一个设计缺陷,但我无法更改它,因为我没有创建EMR 我创建了一个表值函数,解析xml并返回数据,但select语句无法执行,因为函数中的xml转换有时会失败。我不能在函数中进行try/catch转换,也不能从函数中调用存储过程来进行try/catch转换,因此我不确定该如何进行转换 从Audit withnolock中选择前1

我试图设计一个查询来搜索EMR数据库中的审计日志。问题是审计信息存储在一个varchar列中,有时它只是一个文本描述,我不关心发生了什么,有时它包含有效的XML,我知道这是一个设计缺陷,但我无法更改它,因为我没有创建EMR

我创建了一个表值函数,解析xml并返回数据,但select语句无法执行,因为函数中的xml转换有时会失败。我不能在函数中进行try/catch转换,也不能从函数中调用存储过程来进行try/catch转换,因此我不确定该如何进行转换

从Audit withnolock中选择前1* 外部应用dbo.cus_GetDeletedAttachmentInfoAudit.Audituid作为详细信息

错误
XML解析:第1行,字符136,非法XML字符

如果标记中有非法字符,则在尝试转换为XML时需要捕获。我是这样做的:

declare @Text varchar(max);

select @Text = '<root><stuff>&</stuff></root>'


begin try
    select Cast(@Text as xml)
end try
begin catch
    Select Error_message()

    Select 'Let''s account for ampersand manually by converting'

    select cast(replace(@Text, '&', '&amp;') as xml)
end catch
您需要考虑未标记的符号和其他字符,否则SQL server中强制转换或转换的默认行为是失败,并说明失败原因。XML需要标记特殊字符。一般来说,这里有一些标记列表,但我没有尝试所有这些,因为这只是一个示例:


并不是所有这些角色都失败了

我查了下面两套。只有第2组有问题

SELECT
    cast( 
        REPLACE(
        REPLACE(fldvalue,'<', '&lt;')
        ,'&','&amp;')
        
         as xml) 
    
FROM
(
    -- set 1
    select fldvalue = '<abc>test</abc>' -- Pure text
    UNION
    select fldvalue = '<abc>$test</abc>' -- with $ symbol
    union
    select fldvalue = '<abc>%test</abc>' -- with % symbol
    UNION
    select fldvalue = '<abc>>1test</abc>' -- with > symbol
    UNION
    select fldvalue = '>>1test' -- with >> symbol
    UNION
    select fldvalue = '<abc>test"</abc>' -- with " symbol
    UNION
    select fldvalue = '¢test' -- with ¢ symbol
    UNION
    select fldvalue = '£test' -- with £ symbol
    UNION
    select fldvalue = '¥test' -- with ¥ symbol
    UNION
    select fldvalue = '©test' -- with © symbol
    UNION
    select fldvalue = '½test'  -- with ½ symbol
    
    
    -- set 2
    UNION
    select fldvalue = '<def><test</def>'
    UNION
    select fldvalue = '&1test'
    
) A

这是MS SQL Server吗?什么版本?它可能没有任何非法字符,并且不是有效的XML。仍然转换是朝着正确方向迈出的一步+1我现在在解析XML时遇到另一个错误:第1行,字符39,无法切换编码您需要通过考虑许多潜在的无效字符来确定数据是否为有效XML。我的示例只是最常见的示例,通常是有人在字符串字段中放置一个“与”。您可以随时发布varchar字段,我们可以尝试以这种方式解决它。我将编写一个过程来执行转换,在try/catch块中尝试许多替换选项。有时候,正如上面提到的,您实际上拥有无效的xml。当有人在没有将文本放在验证器周围的情况下给出文本时,问题在于它不要求是合法的xml。