Reputation: 1494
This is my sample xml,
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfClientContactDetail xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ClientContactDetail>
<PersonName>adsf asfd</PersonName>
<EmailAddress>[email protected]</EmailAddress>
<PhoneNumber>9876543210</PhoneNumber>
</ClientContactDetail>
</ArrayOfClientContactDetail>
This is my sql code:
DECLARE @idoc IN
EXEC sp_xml_preparedocument @idoc OUTPUT
,@ClientDetail;
SELECT *
FROM OPENXML(@idoc, 'ArrayOfClientContactDetail/ClientContactDetail', 2) WITH (
PersonName VARCHAR(100) '@PersonName'
,EmailAddress VARCHAR(100) '@EmailAddress'
,PhoneNumber VARCHAR(15) '@PhoneNumber'
,CompanyID INT '@CompanyID'
);
Upvotes: 1
Views: 164
Reputation: 138960
You are specifying in the ColPattern that you want an attribute instead of a node value.
Change '@PersonName'
to 'PersonName'
.
And don't forget to call sp_xml_removedocument
when you are done with @idoc
.
If you are on SQL Server 2005 or later you could use the XML data type instead.
select C.X.value('(PersonName/text())[1]', 'varchar(100)') as PersonName,
C.X.value('(EmailAddress/text())[1]', 'varchar(100)') as EmailAddress,
C.X.value('(PhoneNumber/text())[1]', 'varchar(100)') as PhoneNumber,
C.X.value('(CompanyID/text())[1]', 'varchar(100)') as CompanyID
from @ClientDetail.nodes('ArrayOfClientContactDetail/ClientContactDetail') as C(X);
Upvotes: 2