【问题标题】:Removing illegal Characters in XML while extract data from SQL Server database从 SQL Server 数据库中提取数据时删除 XML 中的非法字符
【发布时间】:2019-06-11 02:23:23
【问题描述】:

我遇到了类似的问题(请参阅下面的错误消息)。我正在为 SQL Server 数据库中的特定单词搜索存储过程。拉取结果集为objectNameObjectTypeObjectText(其中存在搜索词)。我正在尝试将ObjectText 作为 XML 表单,以便可以单击以直接从结果集中打开。它适用于触发器,但不适用于存储过程,因为在转换为 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,以便可以直接从结果集中打开存储过程/触发器。

【问题讨论】:

    标签: sql sql-server xml


    【解决方案1】:

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

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

    两种方法:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多