使用XML数据类型计算元素

时间:2014-03-03 15:18:50

标签: sql-server xml sql-server-2008 xquery

您好我将XML数据存储在表格中。 XML Data看起来像这样。

<Contacts>
  <Contact>
    <Name>Evan Gabriel</Name>
    <PhoneNumbers>
      <PhoneNumber Type="Home" Number="555-1224" />
      <PhoneNumber Type="Work" Number="578-9812" />
      <PhoneNumber Type="Cell" Number="578-7299" />
    </PhoneNumbers>
  </Contact>
  <Contact>
    <Name>Elizabeth Dallas</Name>
    <PhoneNumbers>
      <PhoneNumber Type="Home" Number="714-5488" />
      <PhoneNumber Type="Cell" Number="714-1099" />
    </PhoneNumbers>
  </Contact>
  <Contact>
    <Name>Anna Palmer</Name>
    <PhoneNumbers>
      <PhoneNumber Type="Work" Number="555-1440" />
      <PhoneNumber Type="Cell" Number="714-0523" />
    </PhoneNumbers>
  </Contact>
</Contacts>

我要做的是获取每个客户端的联系号码计数,并且我希望重新调整的输出为XML数据类型。

我想要的输出如下:

<Contacts>
  <Contact>
    <Name>Elizabeth Dallas</Name>
    <NumFound>2</NumFound>
  </Contact>
  <Contact>
    <Name>Anna Palmer</Name>
    <NumFound>2</NumFound>
  </Contact>
  <Contact>
    <Name>Evan Gabriel</Name>
    <NumFound>3</NumFound>
  </Contact>
</Contacts> 

以下是我的尝试:

SELECT
    COUNT(*) AS NumCount
FROM
   (SELECT Xml_DATA FROM Xml_Table) AS XmlTable(XmlColumn)
CROSS APPLY 
   XmlColumn.nodes('/Contacts/Contact/Name/PhoneNumbers/PhoneNumber') XmlTableFunction(XmlColumn2)

但我不认为我接近实际的解决方案。任何帮助或指针在正确的方向非常感谢。

先谢谢你。

SQL FIDDLE with Test Data and My Attempt

1 个答案:

答案 0 :(得分:1)

试试这个:

declare @Contacts xml = '<Contacts>
  <Contact>
    <Name>Evan Gabriel</Name>
    <PhoneNumbers>
      <PhoneNumber Type="Home" Number="555-1224" />
      <PhoneNumber Type="Work" Number="578-9812" />
      <PhoneNumber Type="Cell" Number="578-7299" />
    </PhoneNumbers>
  </Contact>
  <Contact>
    <Name>Elizabeth Dallas</Name>
    <PhoneNumbers>
      <PhoneNumber Type="Home" Number="714-5488" />
      <PhoneNumber Type="Cell" Number="714-1099" />
    </PhoneNumbers>
  </Contact>
  <Contact>
    <Name>Anna Palmer</Name>
    <PhoneNumbers>
      <PhoneNumber Type="Work" Number="555-1440" />
      <PhoneNumber Type="Cell" Number="714-0523" />
    </PhoneNumbers>
  </Contact>
</Contacts>'

select 
    c.query('*[local-name()!="PhoneNumbers"]'),
    NumFound = c.value('count(.//PhoneNumber)', 'int')
from @Contacts.nodes('//Contact') c(c)
for xml path('Contact'), root('Contacts')