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.