1

我有以下格式的 XML:

<filters>
  <filter name="filterByOperatingSystem">
   <parameters operatingSystem="Windows" />
  </filter>
  <filter name="filterBySoftware">
   <parameter software="Office" />
  </filter>
</filters>

存储在@XML.

我想做的是遍历每个过滤器,以便我可以进行一些处理。

我的想法是我可以在光标中获取每个过滤器名称以及参数元素,但到目前为止我能得到的最接近的是:

DECLARE crsDTO cursor static forward_only read_only for 
SELECT  
  tab.col.value('@name','NVARCHAR(64)')
FROM
  @XML.nodes('//filter') tab(col)

我尝试了以下查询以查看是否可以获取参数 xml:

DECLARE crsDTO cursor static forward_only read_only for 
SELECT  
  tab.col.value('@name','NVARCHAR(64)'),
  tab.col.value('parameter[1]' 'XML')
FROM
  @XML.nodes('//filter') tab(col)

但我得到了错误:

值类型中使用的数据类型 XML 无效

因为我的过滤器可以有不同的属性,所以我不想尝试使用第一个查询直接获取属性(我的想法是做光标,然后根据过滤器名称,我可以从节点获取特定参数),但是由于无法取出 xml 节点,我不知道该怎么做。

关于如何解决这个问题的任何建议?

4

3 回答 3

3

你需要这个吗?

DECLARE @XML xml = '<filters>
  <filter name="filterByOperatingSystem">
   <parameters operatingSystem="Windows" />
  </filter>
  <filter name="filterBySoftware">
   <parameter software="Office" />
  </filter>
</filters>'

SELECT  
  tab.col.value('@name','NVARCHAR(64)') as name,
  tab.col.query('./*') as parameters
FROM
  @XML.nodes('//filter') tab(col)

如果过滤器可能具有您可能想要更改的其他子元素类型

  tab.col.query('./*') as parameters

  tab.col.query('./parameters') as parameters

或者

  tab.col.query('./parameter') as parameters

正确的名字是什么。

于 2012-10-26T13:33:27.380 回答
2

改用.query()

declare @xml xml = '<filters>
  <filter name="filterByOperatingSystem">
   <parameters operatingSystem="Windows" />
  </filter>
  <filter name="filterBySoftware">
   <parameter software="Office" />
  </filter>
</filters>';

SELECT  
  tab.col.value('@name','NVARCHAR(64)'),
  tab.col.query('.')
FROM
  @XML.nodes('//filter') tab(col)
于 2012-10-26T13:35:24.623 回答
1

您的 xmlParameter在其中一个Filter节点中没有元素,并且已插入Parameters元素。所以如果你想获取所有元素,你应该写*而不是parameter[1]

declare @xml xml

select @xml = '<filters>
  <filter name="filterByOperatingSystem">
   <parameters operatingSystem="Windows" />
  </filter>
  <filter name="filterBySoftware">
   <parameter software="Office" />
  </filter>
</filters>'

select @xml

select
    T.C.value('@name', 'nvarchar(64)'),
    T.C.query('./parameter[1]') as parameters
from @xml.nodes('/filters/filter') as T(C)
于 2012-10-26T13:28:20.513 回答