首页 > 解决方案 > 从 SQL Server 数据库中提取数据时删除 XML 中的非法字符

问题描述

我面临类似的问题(请参阅下面的错误消息)。我正在为 SQL Server 数据库中的特定单词搜索存储过程。拉取结果集是objectName,ObjectTypeObjectText(其中存在搜索词)。我正在尝试以ObjectTextXML 形式提供,以便可以单击以直接从结果集中打开。它适用于触发器,但不适用于存储过程,因为在转换为 XML 格式时似乎面临非法字符。

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

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%')

错误:

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

CAST(c.text as XML) AS 'SearchObject' 

此列应生成可单击的 XML,以便可以直接从结果集中打开存储过程/触发器。

标签: sqlsql-serverxml

解决方案


如果我理解正确,您不会向我们展示您的专栏c.text可能包含的内容,但您向我们展示了一个相当大的查询,这与您的问题无关......

如果我理解正确,您希望将其c.text作为可点击的 XML 包含到您的结果集中。尽管它的格式不是很好,但它是有效的 XML(或至少不是在所有情况下)。

两种方法:

  • 如果转换出错,请尝试TRY_CAST而不是返回 NULLCAST
  • 使用子查询,例如
    (SELECT c.text AS [*] FOR XML PATH(''),TYPE) AS SearchObject

第一个不会抛出错误,但不会让你开心。&<或(以及许多其他禁止字符)的任何>出现都将强制它以 NULL 显示...

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


推荐阅读