简体   繁体   中英

Insert XML data into SQL Server

I am trying to insert "DocumentFields" values from XML into SQL Server 2008 but no luck.

Can you please help me with this? Below is the XML and the stored procedure used.

CREATE PROCEDURE [dbo].[SP_Test]
   (@xmlData As XML)
AS
BEGIN
    DECLARE @idoc int

    SET @xmlData='<?xml version="1.0" encoding="UTF-8"?>
    <ImportSession>
     <Documents>
      <Document DocumentClassName="RDOCCLASS" Processed="0" Priority="2">
       <DocumentFields>
        <DocumentField Name="DocumentID" Value="419" />
        <DocumentField Name="MessageID" Value="apap-12w-asqwe" />
        <DocumentField Name="AccountName" Value="John Thomas" />
        <DocumentField Name="AccountNumber" Value="1234567890" />
        <DocumentField Name="Contact" Value="00012736782345" />
       </DocumentFields>
      </Document>
     </Documents>
    </ImportSession>'

    EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlData;

    INSERT INTO  dbo.[Account]([DocumentID], [MessageID], [AccountName], [AccountNumber], [Contact])
        SELECT * 
        FROM OPENXML(@idoc,/ImportSession/Documents/Document/DocumentFields',1)
        WITH (DocumentID varchar(20),MessageID varchar(30),
         AccountName varchar(20),AccountNumber varchar(20),
         Contact varchar(20)
         );

    EXEC sp_xml_removedocument @xmlData;
END

Thanks Arsh

OPENXML is absolutely outdated. This is the way you get the data from your XML variable in a modern way:

DECLARE @xmlData XML='<?xml version="1.0" encoding="UTF-8"?>
    <ImportSession>
     <Documents>
      <Document DocumentClassName="RDOCCLASS" Processed="0" Priority="2">
       <DocumentFields>
        <DocumentField Name="DocumentID" Value="419" />
        <DocumentField Name="MessageID" Value="apap-12w-asqwe" />
        <DocumentField Name="AccountName" Value="John Thomas" />
        <DocumentField Name="AccountNumber" Value="1234567890" />
        <DocumentField Name="Contact" Value="00012736782345" />
       </DocumentFields>
      </Document>
     </Documents>
    </ImportSession>';

SELECT Doc.value('(DocumentFields/DocumentField[@Name="DocumentID"]/@Value)[1]','int') AS DocumentID
      ,Doc.value('(DocumentFields/DocumentField[@Name="MessageID"]/@Value)[1]','varchar(max)') AS MessageID
      ,Doc.value('(DocumentFields/DocumentField[@Name="AccountName"]/@Value)[1]','varchar(max)') AS AccountName
      ,Doc.value('(DocumentFields/DocumentField[@Name="AccountNumber"]/@Value)[1]','varchar(max)') AS AccountNumber
      ,Doc.value('(DocumentFields/DocumentField[@Name="Contact"]/@Value)[1]','varchar(max)') AS Contact
FROM @xmlData.nodes('/ImportSession/Documents/Document') AS One(Doc)

So your SP should be this:

Create PROCEDURE [dbo].[SP_Test]
 (
    @xmlData As XML
 )

As
BEGIN



 INSERT INTO  dbo.[Account]([DocumentID],
                           [MessageID],
                           [AccountName],
                           [AccountNumber],
                           [Contact]
                          )

SELECT Doc.value('(DocumentFields/DocumentField[@Name="DocumentID"]/@Value)[1]','int') AS DocumentID
      ,Doc.value('(DocumentFields/DocumentField[@Name="MessageID"]/@Value)[1]','varchar(max)') AS MessageID
      ,Doc.value('(DocumentFields/DocumentField[@Name="AccountName"]/@Value)[1]','varchar(max)') AS AccountName
      ,Doc.value('(DocumentFields/DocumentField[@Name="AccountNumber"]/@Value)[1]','varchar(max)') AS AccountNumber
      ,Doc.value('(DocumentFields/DocumentField[@Name="Contact"]/@Value)[1]','varchar(max)') AS Contact
FROM @xmlData.nodes('/ImportSession/Documents/Document') AS One(Doc);
END

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM