sql - 从 SQL Server 数据库中提取数据时删除 XML 中的非法字符
问题描述
我面临类似的问题(请参阅下面的错误消息)。我正在为 SQL Server 数据库中的特定单词搜索存储过程。拉取结果集是objectName
,ObjectType
和ObjectText
(其中存在搜索词)。我正在尝试以ObjectText
XML 形式提供,以便可以单击以直接从结果集中打开。它适用于触发器,但不适用于存储过程,因为在转换为 XML 格式时似乎面临非法字符。
我尝试了网上提供的一些建议,例如转换/转换/替换统一字符、XML、ascii 等,并替换非法字符,如
, 

,	
但没有成功。
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,以便可以直接从结果集中打开存储过程/触发器。
解决方案
如果我理解正确,您不会向我们展示您的专栏c.text
可能包含的内容,但您向我们展示了一个相当大的查询,这与您的问题无关......
如果我理解正确,您希望将其c.text
作为可点击的 XML 包含到您的结果集中。尽管它的格式不是很好,但它是有效的 XML(或至少不是在所有情况下)。
两种方法:
- 如果转换出错,请尝试
TRY_CAST
而不是返回 NULLCAST
- 使用子查询,例如
(SELECT c.text AS [*] FOR XML PATH(''),TYPE) AS SearchObject
第一个不会抛出错误,但不会让你开心。&
,<
或(以及许多其他禁止字符)的任何>
出现都将强制它以 NULL 显示...
第二个将采用列内容,并将隐式地为您的所有转义...请注意,在 XML 查看器中,您将看到转义序列而不是禁止字符
推荐阅读
- python - 如何根据第一列获取最大值,然后索引其他列值,如果条件不匹配,则基于第二列?
- flutter - Flutter:找不到证书路径的信任锚
- cloudflare - Cloudflare cookie 被所有子域重用
- templates - 使用 PC-Lint Plus 弃用类模板
- python - 将 dict 写入 CSV 后,如何恢复它以检索原始 dict
- c - 从 Keil 中的 uint8_t 数组获取 uint16_t 值
- c# - 将文本/纯多行键=值 http 响应映射到 json 和/或 c# 对象
- python - 将列表中的值分组并将它们存储为子列表
- python - 如何在python中以功能方式将分层数据结构中的字符串转换为dict?
- firebase - 无法从实时数据库中保存值