Click here to Skip to main content
15,900,258 members
Please Sign up or sign in to vote.
4.00/5 (1 vote)
See more:
Hello all.I am working on XML.I want to create an element and its value will be computed as the sum of the other elements values like as follows
XML
<Name>
  <firstName>Christophe</firstName>
  <middleName>Robert</middleName>
  <lastName>Mulford</lastName>
  <maidenName/>
  <suffix>SR</suffix>
  <autoLastName>Mulford SR</autoLastName>
  <autoFullName>Christophe Robert Mulford SR</autoFullName>
</Name>


in the above code the element Name is of XML complex data type
XML
<xs:complexType name="cdms_DetailedName">
       <xs:sequence>
           <xs:element name="firstName" type="xs:string"/>
           <xs:element name="middleName" type="xs:string"/>
           <xs:element name="lastName" type="xs:string"> </xs:element>
           <xs:element name="maidenName" type="xs:string"/>
           <xs:element name="suffix">
               <xs:simpleType>
                   <xs:restriction base="xs:string">
                       <xs:enumeration value="JR"/>
                       <xs:enumeration value="SR"/>
                       <xs:enumeration value="II"/>
                       <xs:enumeration value="III"/>
                       <xs:enumeration value="IV"/>
                       <xs:enumeration value="V"/>
                   </xs:restriction>
               </xs:simpleType>
           </xs:element>
           <xs:element name="autoLastName"/>
           <xs:element name="autoFullName"/>
       </xs:sequence>
   </xs:complexType>



and the autoFullName is the result of firstName+' '+middleName+' '+lastName+' '+suffix


I want to do this automatically by specifying a formula in XML schema file or in the XML data type at once so that the autoFullName element will be computed automatically.
Posted
Updated 28-Jun-11 23:35pm
v2

Create this procedure
SQL
CREATE PROCEDURE PopulateFullNameInThisXML
	@XmlData XML
AS
BEGIN

DECLARE @xmltble TABLE
(
        firstName NVARCHAR(MAX),
        middleName NVARCHAR(MAX),
        lastName NVARCHAR(MAX),
        maidenName NVARCHAR(MAX),
        suffix NVARCHAR(MAX),
        autoLastName NVARCHAR(MAX),
        autoFullName NVARCHAR(MAX)
)


INSERT INTO @xmltble
select 
R.i.query('firstName').value('.', 'varchar(30)') [firstName],
R.i.query('middleName').value('.', 'varchar(30)') [middleName],
R.i.query('lastName').value('.', 'varchar(30)') [lastName],
R.i.query('maidenName').value('.', 'varchar(30)') [maidenName],
R.i.query('suffix').value('.', 'varchar(30)') [suffix],
R.i.query('autoLastName').value('.', 'varchar(30)') [autoLastName],
R.i.query('autoFullName').value('.', 'varchar(30)') [autoFullName]
from @XmlData.nodes('/Name') R(i)


SELECT 
 [firstName],
 [middleName],
 [lastName],
 [maidenName],
 [suffix],
 lastName + suffix AS [autoLastName],
 [firstName] + [middleName]  +  lastName + suffix AS [autoFullName]
FROM @xmltble FOR XML PATH('Name')


END


Now use it as below
SQL
DECLARE @XmlData xml


SET @XmlData='    <name>
        <firstname>Christophe</firstname>
        <middlename>Robert</middlename>
        <lastname>Mulford</lastname>
        <maidenname />
        <suffix>SR</suffix>
        <autolastname>Mulford SR</autolastname>
        <autofullname></autofullname>
      </name>
<name>
        <firstname>Christophe</firstname>
        <middlename>Robert</middlename>
        <lastname>Mulford</lastname>
        <maidenname />
        <suffix>SR</suffix>
        <autolastname>Mulford SR</autolastname>
        <autofullname></autofullname>
      </name>'


exec PopulateFullNameInThisXML @XmlData


You will get output like this

XML
<Name>
  <firstName>Christophe</firstName>
  <middleName>Robert</middleName>
  <lastName>Mulford</lastName>
  <maidenName></maidenName>
  <suffix>SR</suffix>
  <autoLastName>MulfordSR</autoLastName>
  <autoFullName>ChristopheRobertMulfordSR</autoFullName>
</Name>
<Name>
  <firstName>Christophe</firstName>
  <middleName>Robert</middleName>
  <lastName>Mulford</lastName>
  <maidenName></maidenName>
  <suffix>SR</suffix>
  <autoLastName>MulfordSR</autoLastName>
  <autoFullName>ChristopheRobertMulfordSR</autoFullName>
</Name>
 
Share this answer
 
Comments
gvprabu 22-Feb-13 23:51pm    
Hi Rahul Dhoble,

Very nice Example for XML...

If I run Your Script, I didn't Got the Output.

I want to know XML tags are Case Sensitive like "name" and "Name" are Different?

I changed like this

DECLARE @XmlData xml
SET @XmlData="Name" Details "/Name"
EXEC PopulateFullNameInThisXML @XmlData

Then its working...

Regards,
GVPrabu
RDBurmon 23-Feb-13 0:53am    
Yes XML nodes are case sensitive
RDBurmon 23-Feb-13 0:54am    
Any way you did it and worked for you.
Accept and close this solution
Just in case RD's solution (NO 1) is giving you fits (as it did me when I tried it "as-is"), a slightly reworked copy which did work for me.
CREATE PROCEDURE sp_SW_PopulateFullNameInThisXML
	@XmlData XML
	AS
	BEGIN
	
		DECLARE @xmltble TABLE
		(
				[firstName] NVARCHAR(MAX),
				[middleName] NVARCHAR(MAX),
				[lastName] NVARCHAR(MAX),
				[maidenName] NVARCHAR(MAX),
				[suffix] NVARCHAR(MAX),
				[autoLastName] NVARCHAR(MAX),
				[autoFullName] NVARCHAR(MAX)
		)
		INSERT INTO @xmltble
			SELECT
				R.i.value('firstName[1]', 'varchar(30)') AS [firstName],
				R.i.value('middleName[1]', 'varchar(30)') AS [middleName],
				R.i.value('lastName[1]', 'varchar(30)') AS [lastName],
				R.i.value('maidenName[1]', 'varchar(30)') AS [maidenName],
				R.i.value('suffix[1]', 'varchar(30)') AS [suffix],
				R.i.value('autoLastName[1]', 'varchar(30)') AS [autoLastName],
				R.i.value('autoFullName[1]', 'varchar(30)') AS [autoFullName]
					FROM @XmlData.nodes('/name') AS R(i)
		 
		SELECT 
			 [firstName],
				[middleName],
					[lastName],
						[maidenName],
							[suffix],
								[lastName] + [suffix] AS [autoLastName],
									[firstName] + [middleName] + [lastName] + [suffix] AS [autoFullName]
				FROM @xmltble FOR XML PATH('Name')
	END 		

Run the SP
DECLARE @XmlData xml
SET @XmlData   =         '<name>
				<firstname>Christophe</firstname>
				<middlename>Robert</middlename>
				<lastname>Mulford</lastname>
				<maidenname></maidenname>
				<suffix>SR</suffix>
				<autolastname>Mulford SR</autolastname>
				<autofullname></autofullname>
			  </name>
			  <name>
				<firstname>Christophe</firstname>
				<middlename>Robert</middlename>
				<lastname>Mulford</lastname>
				<maidenname></maidenname>
				<suffix>SR</suffix>
				<autolastname>Mulford SR</autolastname>
				<autofullname></autofullname>
			  </name>'

EXEC sp_SW_PopulateFullNameInThisXML @XmlData		

Thanks for the help RD .. I really was struggling with SW's exact problem!
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900