0

我正在尝试编写一个查询来提取我的报表服务器中所有参数的名称。参数数据作为 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]
4

1 回答 1

1

第一个问题的答案是:是的,它就像 CONVERT(xml, Parameter) 一样简单。假设它是格式良好的 XML,它会转换得很好

第二个问题将涉及 XML 数据类型的 nodes() 方法。阅读所有相关信息:nodes()

编辑:

现在我可以测试了,这就是我想出的:

WITH cte AS (
    SELECT   CAST(parameter AS XML) AS parameter
    FROM     [dbo].[Catalog] AS c
)
SELECT  p.value('(./Name)[1]', 'nvarchar(50)')
FROM    cte AS c
CROSS APPLY c.Parameter.nodes('/Parameters/Parameter') AS T ( p )
于 2012-08-09T20:31:02.527 回答