0

私は次のXMLを持っています:

<xmlRoot>
  <DomainName>sample.com</DomainName>
  <UserCountsByTemplate>
    <KeyValueOfstringint>
      <Key>default</d2p1:Key>
      <Value>20</d2p1:Value>
    </KeyValueOfstringint>
    <KeyValueOfstringint>
      <Key>basic</d2p1:Key>
      <Value>66</d2p1:Value>
    </KeyValueOfstringint>
  </UserCountsByTemplate>
</xmlRoot>

次のように2つの行が返されるようにしようとしています。

Domain      TemplateName  TemplateCount
----------  ------------  -------------
sample.com  default       20
sample.com  basic         66

私は以下を試しました:

DECLARE @info XML
SELECT @info = '<xmlRoot><DomainName>sample.com</DomainName><UserCountsByTemplate><KeyValueOfstringint><Key>default</Key><Value>20</Value></KeyValueOfstringint><KeyValueOfstringint><Key>basic</Key><Value>66</Value></KeyValueOfstringint></UserCountsByTemplate></xmlRoot>'
SELECT 
      row.value('DomainName[1]','NVARCHAR(255)') AS [DomainName]
    , row2.value('.','NVARCHAR(255)') AS [TemplateName]
    , row3.value('.','INT') AS [TemplateCount]
FROM @info.nodes('/xmlRoot[1]') T1(row)
CROSS APPLY @info.nodes('/xmlRoot/UserCountsByTemplate/KeyValueOfstringint/Key') T2(row2)
CROSS APPLY @info.nodes('/xmlRoot/UserCountsByTemplate/KeyValueOfstringint/Value') T3(row3)

ただし、次の結果が得られます。

Domain      TemplateName  TemplateCount
----------  ------------  -------------
sample.com  default       20
sample.com  basic         20
sample.com  default       66
sample.com  basic         66

私がこれでどこが間違っているのかについてのアイデアはありますか?

4

1 に答える 1

1

キーへのアクセスと値へのアクセスを相互に関連付けていないため、すべてのキーとすべての値の間にクロス結合を効果的に生成しています。

DECLARE @info XML
SELECT @info = '<xmlRoot><DomainName>sample.com</DomainName><UserCountsByTemplate><KeyValueOfstringint><Key>default</Key><Value>20</Value></KeyValueOfstringint><KeyValueOfstringint><Key>basic</Key><Value>66</Value></KeyValueOfstringint></UserCountsByTemplate></xmlRoot>'
SELECT 
      row.value('DomainName[1]','NVARCHAR(255)') AS [DomainName]
    , row2.value('Key[1]','NVARCHAR(255)') AS [TemplateName]
    , row2.value('Value[1]','INT') AS [TemplateCount]
FROM @info.nodes('/xmlRoot[1]') T1(row)
CROSS APPLY @info.nodes('/xmlRoot/UserCountsByTemplate/KeyValueOfstringint') T2(row2)

代わりに、ノードを抽出してKeyValueOfstringIntから、呼び出しのさまざまな要素にアクセスしていvalue()ます。ただし、両方のvalue()呼び出しは(行ごとに)同じノードで動作しています。

于 2012-08-16T14:40:29.190 に答える