Sql server 通过MS SQL中的openxml存储过程在表中逐行插入数据

Sql server 通过MS SQL中的openxml存储过程在表中逐行插入数据,sql-server,stored-procedures,openxml,Sql Server,Stored Procedures,Openxml,我试图通过XML格式插入数据。与下面定义的XML格式相同&我希望在SQL表中逐行插入字段。但,并没有一个地址插入到SQL表中,只有客户信息插入到伪表中 <XML> <Customer> <NAME>YOGESH</NAME> <CONTACT>YOGESH SHARMA</CONTACT> <Mobile>123456789</Mobile> <Statu

我试图通过XML格式插入数据。与下面定义的XML格式相同&我希望在SQL表中逐行插入字段。但,并没有一个地址插入到SQL表中,只有客户信息插入到伪表中

<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>
因此,我只想在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
那么,我当前存储过程中的问题是什么&需要纠正它

谢谢你 约格什

您的问题在

(SELECT ID FROM DUMMY WHERE Name = Name)
它返回
DUMMY
表中的所有值,并导致错误

子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情

解决方案:

-- 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;

在这里,我做了一个相同的演示。请调查一下

首先,我创建了两个表,它们是Customer(表名Dummy)和Customer_Address(表名DummyText)。它们看起来像下面的快照

表格:客户

表格:客户地址

以下是您更新的存储过程

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数据,两个表中的条目如下所示


无法在DummyExtd表中插入地址信息,插入的值为空。感谢您的回复,但我们尚未修复关于ADD1、ADD2的问题。添加(n)将不会是(s)ADD1。
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