从SQL Server数据库提取数据时删除XML中的非法字符

时间:2019-06-11 02:23:23

标签: sql sql-server xml

我正面临类似的问题(请参见下面的错误消息)。我正在搜索存储过程中SQL Server数据库中的特定单词。提取结果集为mysql> delete from django_migrations where id=361; objectNameObjectType(存在搜索词)。我正在尝试将ObjectText作为XML格式,以便可以单击以直接从结果集中打开。它可以与触发器配合使用,但不能与存储过程配合使用,因为在转换为XML格式时似乎面临非法字符。

我尝试了网上提供的一些建议,例如强制转换/转换/替换统一字符,XML,ASCII等,并替换了ObjectText&#xD&#xA等非法字符,但没有成功。

&#x9

错误:

  

9455消息,第16级,状态1,第121行
  XML解析:第44行,字符28,非法的限定名称字符

SELECT 
    o.name as 'ObjectName', 
    CASE o.xtype 
       WHEN 'C' THEN 'CHECK constraint ' 
       WHEN 'D' THEN 'Default or DEFAULT constraint'
       WHEN 'F' THEN 'FOREIGN KEY constraint'
       WHEN 'FN' THEN 'Scalar function'
       WHEN 'IF' THEN 'In-lined table-function'
       WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint'
       WHEN 'L' THEN 'Log'
       WHEN 'P' THEN 'Stored procedure'
       WHEN 'R' THEN 'Rule'
       WHEN 'RF' THEN 'Replication filter stored procedure' 
       WHEN 'S' THEN 'System table'  
       WHEN 'TF' THEN 'Table function' 
       WHEN 'TR' THEN 'Trigger'  
       WHEN 'U' THEN 'User table' 
       WHEN 'V' THEN 'View' 
       WHEN 'X' THEN 'Extended stored procedure' 
       ELSE o.xtype 
    END as 'ObjectType',
    CAST(c.text as XML) as 'SearchObject'
FROM 
    syscomments c
INNER JOIN 
    sysobjects o ON c.id = o.id
LEFT JOIN 
    sysobjects p ON o.Parent_obj = p.id
WHERE 
    o.xtype = 'P'
    AND (c.text LIKE '%loan_timestamp%' OR 
         c.text LIKE '%aclk_timestamp%' OR
         c.text LIKE '%addr_timestamp%')

此列的结果应为可点击的XML,因此可以直接从结果集中打开存储过程/触发器。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这一点,则您不会向我们显示您的列__consumer_offsets可能包含的内容,但是向我们显示了一个相当大的查询,与您的问题无关...

如果我正确理解了这一点,则希望将c.text作为可点击XML包含在结果集中。尽管格式不正确,但有效的XML(或至少在所有情况下都无效)。

两种方法:

  • 如果强制转换错误,请尝试使用c.text而不是TRY_CAST返回NULL
  • 使用类似
    的子查询 CAST

第一个不会引发错误,但不会使您高兴。 (SELECT c.text AS [*] FOR XML PATH(''),TYPE) AS SearchObject&<(以及许多其他禁止的字符)的出现将迫使其显示为NULL ...

第二个将获取列内容,并将为您隐式进行所有转义。请注意,在XML查看器中,您将看到转义的序列而不是禁止的字符