2012-03-16 17 views
0

他のテーブルにあるxmlドキュメント(リレーショナルモデル)のテーブルデータに挿入する必要があります。私は、SQL ServerにXMLの構造の2005年xmlドキュメントからt-sqlを使用したリレーショナルモデルへの変換

例使用しています:

<order id=”123”> 
<products> 
    <product prodId=”2120”> 
     <name>Product1</name> 
     <quantity>2</quantity> 
    </product> 
    <product prodId=”1200”> 
     <name>Product2</name> 
     <quantity>4</quantity> 
    </product> 
    <product prodId=”945”> 
     <name>Product3</name> 
     <quantity>1</quantity> 
    </product> 
</products> 
</order> 

を...と、結果表:

OrderID ProductID Name  Quantity 
123  2120  Product1 2 
123  1200  Product2 4 
123  945  Product3 1 

私はOPENXMLツールを使用してこの問題を解決するが、それは少し遅いです。 XQueryでこれを行うにはどうしたらいいですか? このようなタスクを解決するための最高のメトは何ですか?

+0

"open xml tool"とはどういう意味ですか?それは[this OPENXML](http://msdn.microsoft.com/en-us/library/ms186918.aspx)ですか?その場合は、openxmlでこれを解決するためのコードを追加してください。それがなければ、より速く実行される答えを提供することは不可能です。 –

+0

私が知る限り、 'openxml'は、xmlデータの大きな断片を細断するために、xqueryよりはるかに高速です。したがって、あなたはすでに利用可能な最良の方法を使用しています。 –

+0

とにかく、GoogleのXMLシュレッディングSQLサーバー ' –

答えて

0
DECLARE @xml_str XML = 
    '<order id="123"> <products> 
    <product prodId="2120"> 
     <name>Product1</name> 
     <quantity>2</quantity> 
    </product> 
    <product prodId="1200"> 
     <name>Product2</name> 
     <quantity>4</quantity> 
    </product> 
    <product prodId="945"> 
     <name>Product3</name> 
     <quantity>1</quantity> 
    </product> </products> </order>' 

SELECT 
    c.value('(../../@id)', 'int') AS OrderID, 
    c.value('(@prodId)[1]', 'int') AS ProductID, 
    c.value('(./name)[1]', 'varchar(20)') AS Name, 
    c.value('(./quantity)[1]', 'int') AS Quantity 
FROM @xml_str.nodes ('(/order/products/product)') AS t(c) 
GO 

OrderID  ProductID Name     Quantity 
----------- ----------- -------------------- ----------- 
123   2120  Product1    2 
123   1200  Product2    4 
123   945   Product3    1 

(3 row(s) affected) 
関連する問題