2017-07-26 69 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)。 –

相关问题