在Sql Server中使用XQuery来解析XML Complex类型

时间:2011-10-26 14:58:41

标签: sql sql-server-2005 sql-server-2008

我有以下XML:

<Feed>
  <FeedId>10</FeedId>
   <Component>
     <Date>2011-10-01</Date>
     <Date>2011-10-02</Date>
   </Component>
</Feed>

现在,如果可能,我想将XML解析为sql,以便将其序列化为以下关系数据:

FeedId   Component_Date
10       2011-10-01
10       2011-10-02

但是使用以下SQL:

DECLARE @XML XML;
DECLARE @XMLNodes XML;
SET @XML = '<Feed><FeedId>10</FeedId><Component><Date>2011-10-01</Date><Date>2011-10-02</Date></Component></Feed>';

SELECT  t.a.query('FeedId').value('.', 'INT') AS FeedId
    ,t.a.query('Component/Date').value('.', 'VARCHAR(80)') AS [Component_Date]
    FROM @XML.nodes(' /Feed') AS t(a)

我最接近的是:

FeedId  Component_Date
10  2011-10-012011-10-02

所以日期值出现在同一行,是否可以使用XQuery实现我想要的效果?

2 个答案:

答案 0 :(得分:4)

您需要第二次调用.nodes(),因为您的XML中有多个条目 - 试试这个:

SELECT  
    t.a.value('(FeedId)[1]', 'INT') AS FeedId,
    c.d.value('(.)[1]', 'DATETIME') AS [Component_Date]
FROM 
    @XML.nodes('/Feed') AS t(a)
CROSS APPLY
    t.a.nodes('Component/Date') AS C(D)

给我一​​个输出:

FeedId  Component_Date
  10    2011-10-01 00:00:00.000
  10    2011-10-02 00:00:00.000

答案 1 :(得分:0)

好的,我可以使用OPENXML方法:

eclare @idoc int
DECLARE @XML XML;
DECLARE @XMLNodes XML;
SET @XML = '<Feed><FeedId>10</FeedId><Component><Date>2011-10-01</Date><Date>2011-10-02</Date></Component></Feed>';

exec sp_xml_preparedocument @idoc OUTPUT, @XML
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM   OPENXML (@idoc, '/Feed/Component/Date',1)
         WITH (
                FeedId              Int         '../../FeedId',
                ComponentDate       Date         'text()'
               )