如何解决设置多个 XMLNAMESPACES 以说明 SQL 查询中不同版本的 SSRS/SQL
我正在尝试查询 SSRS 报告服务器数据库,以搜索使用 LIKE 语句使用特定存储过程的任何报告。
以下代码完美运行:
tsconfig.json
但是,我想跨多个 XML 命名空间进行查询,以说明 SSRS/sql 版本随时间的变化,以确保查询不会遗漏任何记录。
// tsconfig.json
{
"module": "ESNext","moduleResolution": "node"
}
我仍然是 XML 的相对初学者,有什么想法或建议我会如何去做吗?
非常感谢
解决方法
如果您不担心不同命名空间中的节点发生冲突,那么您可以使用 *:node
SELECT
CATDATA.Name AS ReportName,CATDATA.Path AS ReportPathLocation,xmlcolumn.value('(@Name)[1]','VARCHAR(250)') AS DataSetName,xmlcolumn.value('(*:Query/*:DataSourceName/text())[1]','VARCHAR(250)') AS DataSoureName,xmlcolumn.value('(*:Query/*:CommandText/text())[1]','VARCHAR(2500)') AS CommandText
FROM (
SELECT C.Name,C.Path,CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)) AS reportXML
FROM ReportServer.dbo.Catalog C
WHERE C.Content is not null
AND C.Type = 2
) CATDATA
CROSS APPLY reportXML.nodes('/*:Report/*:DataSets/*:DataSet') xmltable ( xmlcolumn )
WHERE
xmlcolumn.value('(*:Query/*:CommandText/text())[1]','VARCHAR(500)') LIKE '%sp_%'
ORDER BY CATDATA.Name
出于性能原因,您应该始终使用 /text()
来获取节点的内部文本。
请注意,您可以将 WHERE
过滤器合并到 nodes
过滤器中,并直接在 XQuery 中执行此操作:
CROSS APPLY reportXML.nodes(
'/*:Report/*:DataSets/*:DataSet[
*:Query[*:CommandText[
contains(text()[1],"sp_")
]]]') xmltable ( xmlcolumn )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。