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>

我试图让两行像这样返回:

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

您没有关联对 Key 的访问和对 value 的访问 - 因此您有效地在所有键和所有值之间产生了交叉连接。

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 回答