2011-10-26 63 views
1

我有下面的XML:在SQL Server中使用XQuery来解析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?

回答

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 
+0

不需要使用第二个节点()。你可以使用''../../ FeedId [1]'**来达到FeedId的值,但是**速度要快很多。 +1 –

+0

非常好,正是我想要的Mikael,谢谢 – Rubans

0

OK,我可以用做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()' 
       ) 
+0

SQL Azure不支持“OPENXML”。我们将得到以下错误**此版本的SQL Server不支持'OPENXML'行集提供程序。** – sudhAnsu63