问题描述
我正在尝试查询 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 )