微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置多个 XMLNAMESPACES 以说明 SQL 查询中不同版本的 SSRS/SQL

如何解决设置多个 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 举报,一经查实,本站将立刻删除。