2017-07-26 104 views
2

我試圖插入數據VIA XML格式。和以下定義的XML格式相同&我想在SQL表中逐行插入字段。但是,沒有地址在SQL表中插入,只有客戶信息被插入到Dummy Table中。在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

你的問題是在

(SELECT ID FROM DUMMY WHERE Name = Name) 

它返回從DUMMY表中的所有值,並導致錯誤。

子查詢返回的值超過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

這裏我做了一個演示的一樣。請看看這個。首先,我創建了兩個表,即Customer(您的表名稱Dummy)和Customer_Address(您的表名稱DummyText)。它們看起來像下面的快照。

表:客戶

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 

使用此過程我執行了您的示例x​​ml數據,它看起來像兩個表中的條目下面。

enter image description here

+0

感謝您的回覆,但我們尚未確定ADD1,ADD2是否爲add1..to ADD(n)。 –

相關問題