我正在尝试编写一个查询来提取我的报表服务器中所有参数的名称。参数数据作为 XML 存储在 ntext 字段中,因此我认为我不能在其上使用 xquery。
我最初开始做的是为我希望找到的每个参数名称制作案例陈述,但这将是乏味的,我不认为报告开发人员与参数名称完全一致(事实上这是我的原因之一想要查询)。
这是我到目前为止所拥有的,非常简单:
SELECT [Path], [Name], CreationDate, ModifiedDate, Parameter,
CASE WHEN Parameter LIKE '%<Name>UserId</Name>%' THEN 'Yes' ELSE 'No' END AS 'UserId',
CASE WHEN Parameter LIKE '%<Name>Country</Name>%' THEN 'Yes' ELSE 'No' END AS 'Country',
CASE WHEN Parameter LIKE '%<Name>Office</Name>%' THEN 'Yes' ELSE 'No' END AS 'Office'
FROM dbo.Catalog
WHERE type IN (2, 4)
AND [path] NOT LIKE '/Enterprise Reports%'
AND [Path] NOT LIKE '/Email Subscription%'
ORDER BY [Path]
我想我想要的是更像这样的东西:
SELECT [Path], [Name], CreationDate, ModifiedDate, Parameter.query(/Parameters/Parameter/Name)
FROM dbo.Catalog
WHERE type IN (2, 4)
AND [path] NOT LIKE '/Enterprise Reports%'
AND [Path] NOT LIKE '/Email Subscription%'
ORDER BY [Path]
问题是,它是 ntext,而不是 xml。我可以在上面使用转换吗?
另一个问题是,我不知道用于提取 XML 中许多参数的名称字段的 xquery 语法。
文档的架构非常简单:
<Parameters>
<Parameter>
<Name>Some name</Name>
...some more fields i don't care about...
</Parameter>
<Parameter>
<Name>Another name</Name>
</Parameter>
...more parameters, etc.
</Parameters>
我只想列出名称中的内容。
可以有许多节点,每个节点都有一个子节点。
更新:
似乎 Nodes() 应该对我有所帮助,但我正在努力将在线图书和 Simple Talk 文章中的示例应用于我的情况。这是我到目前为止所拥有的:
SELECT [Path], [Name], CreationDate, ModifiedDate, Parameter,
CASE WHEN Parameter LIKE '%<Name>UserId</Name>%' THEN 'Yes' ELSE 'No' END AS 'UserId',
CASE WHEN Parameter LIKE '%<Name>Country</Name>%' THEN 'Yes' ELSE 'No' END AS 'Country',
CASE WHEN Parameter LIKE '%<Name>Office</Name>%' THEN 'Yes' ELSE 'No' END AS 'Office'
, CAST(Parameter AS XML).nodes('/Parameters/Parameter/Name')
FROM dbo.Catalog
WHERE type IN (2, 4)
AND [path] NOT LIKE '/Enterprise Reports%'
AND [Path] NOT LIKE '/Email Subscription%'
ORDER BY [Path]