2017-07-26 9 views
2

データをVIA XMLフォーマットに挿入しようとしています。そして、次のように定義された同じXMLフォーマット&私はSQLテーブルに行を1行ずつ挿入したいと考えています。しかし、アドレスのどれもがSQLテーブルに挿入されていません.Dummyテーブルにのみ顧客情報が挿入されています。MS SQLのopenxmlストアドプロシージャ経由で行のデータをテーブルに挿入

以下のように
<XML> 
    <Customer> 
    <NAME>YOGESH</NAME> 
    <CONTACT>YOGESH SHARMA</CONTACT> 
    <Mobile>123456789</Mobile> 
    <Status>A</Status> 
    <MALE>1</MALE> 
    <Add> 
     <ADD1> 
      <Address>AHMEDABAD</Address> 
      <State>GUJARAT</State> 
      <City>AHMEDABAD</City> 
      <Pincode>380016</Pincode> 
     </ADD1> 
     <ADD2> 
      <Address>RAJKOT</Address> 
      <State>GUJARAT</State> 
      <City>RAJKOT</City> 
      <Pincode>360001</Pincode> 
    </ADD2> 
    </Add> 
    </Customer> 
</XML> 

MY SP:

ALTER PROCEDURE [dbo].[OPENXMLDUMMY] 

@xmlCustomer NTEXT 

AS 
BEGIN 
    DECLARE @DOC INT; 
    EXEC sp_xml_preparedocument 
      @DOC OUTPUT, 
      @xmlCustomer; 
    INSERT INTO Dummy 
    (Name, 
     Contact, 
     Mobile, 
     Status, 
     Male, 
     InsertDate 
    ) 
      SELECT XML.NAME, 
        XML.Contact, 
        XML.Mobile, 
        XML.Status, 
        XML.Male, 
        GETDATE() 
      FROM OPENXML(@DOC, '/XML/Customer', 2) WITH(Name VARCHAR(50), 
Contact VARCHAR(75), Mobile BIGINT, Status VARCHAR(10), Male VARCHAR(10), 
InsertDate DATETIME) XML; 

    INSERT INTO DummyExtd 
    (
     ID, 
    Address, 
    State, 
    City, 
    Pincode 
    ) SELECT (SELECT ID FROM DUMMY WHERE Name = Name), 
    XML.Address, 
    XML.State, 
    XML.City, 
    XML.Pincode 
    FROM OPENXML(@DOC, '/XML/Customer/Add',2) WITH (ID INT, Address 
    VARCHAR(50), State VARCHAR(50), City VARCHAR(50), Pincode INT) XML; 

    EXEC sp_xml_removedocument @DOC; 
END; 

だから、私はちょうどSQLテーブルでフォーマット以下のようにデータを挿入する:

ID Name Contact   Mobile Status Male InsertDate 
1 YOGESH YOGESH SHARMA 123456789 A   1 2017-07-26 13:28:30.957 

ID Address  State City  Pincode 
1 AHMEDABAD GUJARAT AHMEDABAD 380016 
1 RAJKOT  GUJARAT RAJKOT  360001 

だから、私の中に問題が何であります現在のストアドプロシージャ&はそれを修正する必要があります。

よろしくお願い ヨーゲッシュ

答えて

0

あなたの問題は、それがDUMMYテーブルからすべての値を返し、エラーが発生し

(SELECT ID FROM DUMMY WHERE Name = Name) 

です。

サブクエリが1より大きい値を返しました。 サブクエリが、=、!<、< =、>、> =、またはサブクエリが式 として使用されている場合は、これは許可されません。

ソリューション:ここ

-- After the first insert 

Declare @DummyId int = scope_identity() -- get new inserted id from dummy 

INSERT INTO DummyExtd 
(
    ID, 
Address, 
State, 
City, 
Pincode 
) SELECT 
@DummyId,  
XML.Address, 
XML.State, 
XML.City, 
XML.Pincode 
FROM OPENXML(@DOC, '/XML/Customer/Add',2) WITH 
(-- ID INT, --- Remove it, ID tag doesn't exist in your xml 
    Address VARCHAR(50), 
    State VARCHAR(50), 
    City VARCHAR(50), 
    Pincode INT 
) XML; 
+0

DummyExtd表、挿入されたヌル値のアドレス情報を挿入することができません。 –

5

私は同じのための1つのデモを行いました。これを見てください。

まず、Customer(テーブル名Dummy)とCustomer_Address(テーブル名DummyText)という2つのテーブルを作成しました。彼らは以下のスナップのように見えます。

表:カスタマー

enter image description here

表: CUSTOMER_ADDRESS

enter image description here

以下は更新ストア手順があります。

ALTER PROCEDURE [dbo].[OPENXMLDUMMY] 
@xmlCustomer NTEXT 
AS 
BEGIN 
    DECLARE @DOC INT; 
    Declare @CustId INT; 
    EXEC sp_xml_preparedocument 
      @DOC OUTPUT, 
      @xmlCustomer; 

    INSERT INTO Customer(Name, Contact, Mobile, Status, Male, InsertDate) 
    SELECT XML.[NAME], XML.Contact, XML.Mobile, XML.Status, XML.Male, GETDATE() AS InsertDate 
    FROM OPENXML(@DOC, '/XML/Customer', 2) WITH(NAME VARCHAR(50), CONTACT VARCHAR(75), Mobile BIGINT, Status VARCHAR(10), MALE VARCHAR(10), InsertDate DATETIME) XML; 

    SET @CustId = SCOPE_IDENTITY() 


    INSERT INTO Customer_Address(Cust_Id, Address, State, City, Pincode) 
    SELECT @CustId AS Cust_Id, XML.Address, XML.State, XML.City, XML.Pincode 
    FROM OPENXML(@DOC, '/XML/Customer/Add/ADD1',2) WITH 
    ( 
     Address VARCHAR(50), 
     State VARCHAR(50), 
     City VARCHAR(50), 
     Pincode INT 
    ) XML; 

    INSERT INTO Customer_Address(Cust_Id, Address, State, City, Pincode) 
    SELECT @CustId AS Cust_Id, XML.Address, XML.State, XML.City, XML.Pincode 
    FROM OPENXML(@DOC, '/XML/Customer/Add/ADD2',2) WITH 
    ( 
     Address VARCHAR(50), 
     State VARCHAR(50), 
     City VARCHAR(50), 
     Pincode INT 
    ) XML; 

    EXEC sp_xml_removedocument @DOC; 

END 

この手順を使用して、サンプルのxmlデータを実行しました。これは、両方のテーブルの以下のエントリのように見えます。

enter image description here

+0

ご回答いただきありがとうございますが、ADD1、ADD2については修正されていません。ADD1..to ADD(n)にはなりません。 –

関連する問題