1

次のような XML データ ファイルがあります。

<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/@Field の内容を照合し、/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) 
4

1 に答える 1

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) 
于 2012-08-28T19:49:39.727 に答える