0

リモート関数によって送信される注文のグループを記述する XML を含むテーブルがあります。各行には、注文のリストがシステムに到着したときの ID やタイムスタンプなども含まれます。

説明する:

id | date                     | XML 
1    2012-10-20 06:51:13.683   <customer name="Bill"><order oId="1">...</order><order oId="2>...</customer>
2    2012-10-20 07:30:32.833   <customer name="Ben"><order oId="23">...</order></customer>

すべての注文を選択したいのですが、各注文を ID と日付とともに選択することも必要です。いくつかの仮説的な結果:

 id   |  date                  |  Customer | OrderId
 1      2012-10-20 06:51:13.683    Bill       1
 1      2012-10-20 06:51:13.683    Bill       2
 2      2012-10-20 06:51:13.683    Ben        23

周りを見回すと、 TSQL を使用して XML ノードを選択するなどの多くの回答が見つかりましたが、これらはノードの最初のインスタンスの選択のみを扱います。すべての注文ノードを、関連付けられている他のテーブル情報と共に選択したいと考えています。

ありがとう。

4

4 に答える 4

2

列の名前を更新する必要がありますが、これが私が使用したアプローチです。

SELECT xmlviewId, myDate
   , myXml.value('(customer[1]/@name)', 'varchar(10)') AS CustomerName
   , orders.value('@oId', 'VARCHAR(10)') AS OrderId
   , orders.value('../@name', 'VARCHAR(10)') AS AlternateWayToGEtCustomerName
FROM xmlView
CROSS APPLY myXml.nodes('//order') AS c(orders);

SQL フィドルの

xquery値の良い例を次に示します。

好みに応じて、customerName を取得する 2 つ目の方法を追加しました。

于 2012-10-26T16:17:37.477 に答える
2

SQL フィドルの例

2つの適用でそれを行う方がより論理的だと思います

select
    tt.id,
    tt.date,
    cust.col.value('@name', 'nvarchar(128)') as Customer,
    ord.col.value('@oId', 'int') as OrderId
from tt as tt
    outer apply tt.[xml].nodes('/customer') as cust(col)
    outer apply cust.col.nodes('order') as ord(col)

1回の申請でそれを行うこともできます

SQL フィドルの例

select
    tt.id,
    tt.date,
    ord.col.value('../@name', 'nvarchar(128)') as Customer,
    ord.col.value('@oId', 'int') as OrderId
from tt as tt
    outer apply tt.[xml].nodes('/customer/order') as ord(col)
于 2012-10-26T16:21:54.820 に答える
0

これがあなたが探しているものだと思います

于 2012-10-26T16:10:06.893 に答える
0

を使用@して属性を指定できるため、クエリは次のようになります。

DECLARE @T TABLE (ID INT, [Date] DATETIME, [XML] XML);
INSERT @T VALUES 
    (1, '20121020 06:51:13.683', '<customer name="Bill"><order oId="1"></order><order oId="2"></order></customer>'),
    (2, '20121020 07:30:32.833', '<customer name="Ben"><order oId="23"></order></customer>');

SELECT  ID,
        [Date],
        [Customer] = [XML].value('(customer/@name)[1]', 'nvarchar(200)'),
        [OrderID] = t.Orders.value('(@oId)[1]', 'int')
FROM    @T
        CROSS APPLY [XML].nodes('/customer/order') t (Orders)
于 2012-10-26T16:30:05.073 に答える