2012-08-28 67 views
1

我有一個看起來像這樣的XML數據文件:導入XML屬性內容在SQL Server 2005中

<Sales> 
    <Store Number="8" Date="2012-08-20T03:00:00"> 
     <Value Field="CanceledOrders" Value="65.00"/> 
     <Value Field="TotalDollars" Value="13.57"/> 
    </Store> 
    <Store Number="10" Date="2012-08-20T03:00:00"> 
     <Value Field="CanceledOrders" Value="38.00"/> 
     <Value Field="TotalDollars" Value="29.22"/> 
    </Store> 
</Sales> 

我抓我的頭就如何提取到這樣一個正常的SQL表本:

+--------+---------------------+----------------+--------------+ 
| Number |  Date   | CanceledOrders | TotalDollars | 
+--------+---------------------+----------------+--------------+ 
|  8 | 2012-08-20T03:00:00 | 65.00   | 13.57  | 
|  10 | 2012-08-20T03:00:00 | 38.00   | 29.22  | 
+--------+---------------------+----------------+--------------+ 

這是我到目前爲止。我無法弄清楚如何匹配XML屬性內容值。 我想匹配/ Sales/Store/Value/@字段內容並從/ Sales/Store/Value/@ Value返回值。

DECLARE @X AS xml 

SET @X = '<Sales> 
    <Store Number="8" Date="2012-08-20T03:00:00"> 
    <Value Field="CanceledOrders" Value="65.00" /> 
    <Value Field="TotalDollars" Value="13.57" /> 
    </Store> 
    <Store Number="10" Date="2012-08-20T03:00:00"> 
    <Value Field="CanceledOrders" Value="38.00" /> 
    <Value Field="TotalDollars" Value="29.22" /> 
    </Store> 
</Sales>' 

-- This is my start but it obviously doesn't return what I need. 
SELECT Y.ID.value('(@Number)[1]', 'int') AS Number, 
     Y.ID.value('(@Date)[1]', 'datetime') AS [Date], 
     Y.ID.value('(Value/@Field)[1]', 'varchar(max)') AS "Field", 
     Y.ID.value('(Value/@Value)[1]', 'varchar(max)') AS "Value" 
FROM @X.nodes('/Sales/Store') AS Y(ID) 

回答

1

試試這個:

SELECT 
    Y.ID.value('(@Number)[1]', 'int') AS Number, 
    Y.ID.value('(@Date)[1]', 'datetime') AS [Date], 
    CancelledOrders = Y.ID.value('(Value[@Field="CanceledOrders"]/@Value)[1]', 'decimal(18,4)'), 
    TotalDollars = Y.ID.value('(Value[@Field="TotalDollars"]/@Value)[1]', 'decimal(18,4)') 
FROM 
    @input.nodes('/Sales/Store') AS Y(ID) 
+1

馬克,你是一個紳士和學者。謝謝! – programmer