1

XMLファイルをSQLServerデータベースにインポートしようとしています。コードとxmlファイルをご覧ください。前もって感謝します。

私はたくさんのページをグーグルで検索しようとしましたが、それらはすべて1人の子供(またはそれを呼び出す方法)のみを扱っています。

しかし、私の実際のxmlでは、構造は次のようになります。

:1x supplier --> multiple orders --> multiple customers --> multiple products. 

XMLファイルを取得するときに呼び出されるストアドプロシージャを作成する必要があります。

もう一度ありがとうPetr

SQLコード:

DROP TABLE #TEST

CREATE TABLE #TEST
(CUSTID VARCHAR(10),CUSTNAME VARCHAR(50),PRODUCT VARCHAR(500))

INSERT INTO #TEST(CUSTID,CUSTNAME,PRODUCT)
SELECT
    x.orders.query('order/customer/cust_id').value('.', 'VARCHAR(10)'),
    x.orders.query('order/customer/name').value('.', 'VARCHAR(50)'),
    x.orders.query('order/product_lines/product/supplier_prod_num').
   value('.','VARCHAR(500)') 
FROM
   (SELECT CAST(x AS XML)
    FROM OPENROWSET(
          BULK '\\test\Test.xml',
          SINGLE_BLOB) AS T(x)) AS T(x) 
    CROSS APPLY
        x.nodes('order_batch/orders/order/product_lines/product') AS x(orders)

select * from #test

テストするXMLファイル:

<order_batch>
  <order_header>
    <doc_format_ver>1.0</doc_format_ver>
    <originating_software>
      <software_name>test</software_name>
      <software_ver>2.0</software_ver>
    </originating_software>
  </order_header>
  <supplier>
    <cp_supplier_id>93</cp_supplier_id>
    <name>supname</name>
    <address_line_1>address_line_1</address_line_1>
    <address_line_2>address_line_1</address_line_2>
  </supplier>
  <orders>
    <order o_count="1">
      <customer>
        <cust_id>7240</cust_id>
        <name>CustNamek</name>
        <address_line_1>address_line_1</address_line_1>
        <address_line_2>address_line_1</address_line_2>
      </customer>
      <order_details>
        <date_created>2012-10-08</date_created>
        <time_created>05:37:11</time_created>
      </order_details>
      <product_lines>
        <product p_count="1">
          <supplier_prod_num>15115</supplier_prod_num>
          <qty_type>E</qty_type>
        </product>
        <product p_count="2">
          <supplier_prod_num>010211</supplier_prod_num>
          <qty_type>E</qty_type>
        </product>
      </product_lines>
    </order>
    <order o_count="2">
      <customer>
        <cust_id>7238</cust_id>
        <name>custname</name>
        <address_line_1>address_line_1</address_line_1>
        <address_line_2>address_line_1</address_line_2>
      </customer>
      <order_details>
        <supplier_ref>0093513982</supplier_ref>
        <delivery_date>2012-10-08</delivery_date>
        <special_instructions />
      </order_details>
      <product_lines>
        <product p_count="1">
          <supplier_prod_num>6748</supplier_prod_num>
          <qty_type>E</qty_type>
        </product>
        <product p_count="2">
          <supplier_prod_num>6744</supplier_prod_num>
          <qty_type>E</qty_type>
        </product>
      </product_lines>
    </order>
  </orders>
</order_batch>
4

1 に答える 1

2

これはどう:

CREATE TABLE #TEST (CUSTID VARCHAR(50), CUSTNAME VARCHAR(50), PRODUCT VARCHAR(500))

DECLARE @input XML 

SELECT @input = CAST(x AS XML)
FROM OPENROWSET
     (BULK '\\test\Test.xml',
      SINGLE_BLOB) AS T(X)

INSERT INTO #TEST(CUSTID, CUSTNAME, PRODUCT)
    SELECT
        Customers.value('(cust_id)[1]', 'VARCHAR(50)'),
        Customers.value('(name)[1]', 'VARCHAR(50)'),
        Products.value('(supplier_prod_num)[1]', 'VARCHAR(500)')
    FROM
        @input.nodes('/order_batch/orders/order') AS Tbl(Orders)
    CROSS APPLY
        Orders.nodes('customer') AS TblC(Customers)
    CROSS APPLY
        Orders.nodes('product_lines/product') AS TblP(Products)

これはXMLを「細断処理」し、ネストされたCROSS APPLY .nodes()メソッドを使用して、注文ノードから任意の数の顧客と任意の数の製品を抽出します。

于 2012-10-12T13:47:38.327 に答える