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

xmlのノードParameterの1つに要素がなく、要素が挿入されています。したがって、すべての要素を取得したい場合は、代わりに書く必要がありますFilterParameters*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 に答える