February 27, 2012 at 7:59 am
Although I have extracted XML data on occassions, I have never constructed more than very basic XML data and am struggling with the task below.
I need to produce an XML record that has a 'header' section, providing interface information for a target system, followed by different nodes dependent upon the data extracted for this.
As a simplified example:
DECLARE @Version INT;
DECLARE @Identifier INT;
SET @Version = 123;
SET @Identifier = 456;
CREATE TABLE #XML_Demo(
Att_IDVARCHAR(10),
Att_RefVARCHAR(10),
Att_AnswerVARCHAR(10),
Att_Ref2VARCHAR(10),
Att_SubINT
);
INSERT INTO #XML_Demo(Att_ID, Att_Ref, Att_Answer, Att_Ref2, Att_Sub)
VALUES
('', '', '567', '1.2.3' , NULL),
('', '', '890', '4.5.6' , NULL),
('123', '12', '345', '6.7.8' , 1),
('123', '12', '567', '1.2.3' , 2),
('124', '34', '567', '4.5.6' , 3),
('', '', '567', '1.2.3' , 4),
('', '', '789', '4.5.6' , 5);
select * from #XML_Demo;
I should be able to produce the following XML data:
<?xml version="1.0" encoding="utf-8" ?>
- <MainData>
- <MainDataHeader>
<TheVersion>123</TheVersion>
<TheIdentifier>456</TheIdentifier>
</MainDataHeader>
- <NullSubData>
<OtherAnswer NullField1="567" NullField2="1.2.3" />
<OtherAnswer NullField1="890" NullField2="4.5.6" />
</NullSubData>
- <OtherData>
- <Other ID="123" Ref="12">
<OtherAnswer NullField1="345" NullField2="6.7.8" />
<OtherAnswer NullField1="567" NullField2="1.2.3" />
</Other>
- <Other ID="124" Ref="34">
<OtherAnswer NullField1="567" NullField2="4.5.6" />
</Other>
- <Other ID="" Ref="">
<OtherAnswer NullField1="567" NullField2="1.2.3" />
<OtherAnswer NullField1="789" NullField2="4.5.6" />
</Other>
</OtherData>
</MainData>
Where 'Att_Sub' is NULL, the data should be recorded under <NullSubData>, any other value for 'Att_Sub' is grouped under '<OtherData><Other>'.
With my limited XML experience I manage to produce various unsightly versions, but nowhere near what I'm after.
Any assistance with this would be appreciated.
February 27, 2012 at 9:38 am
You have to use lots of sub queries. The encoding header will have to be manually prepended.
SELECT (SELECT @Version AS "TheVersion",
@Identifier AS "TheIdentifier"
FOR XML PATH('MainDataHeader'),TYPE),
(SELECT Att_Answer AS "@NullField1",
Att_Ref2 AS "@NullField2"
FROM #XML_Demo
WHERE Att_Sub IS NULL
FOR XML PATH('OtherAnswer'),ROOT('NullSubData'),TYPE),
(SELECT t1.Att_ID AS "@ID",
t1.Att_Ref AS "@Ref",
(SELECT t2.Att_Answer AS "@NullField1",
t2.Att_Ref2 AS "@NullField2"
FROM #XML_Demo t2
WHERE t2.Att_ID=t1.Att_ID
AND t2.Att_Ref=t1.Att_Ref
AND t2.Att_Sub IS NOT NULL
ORDER BY t2.Att_Sub
FOR XML PATH('OtherAnswer'),TYPE)
FROM #XML_Demo t1
WHERE t1.Att_Sub IS NOT NULL
GROUP BY t1.Att_ID,t1.Att_Ref
ORDER BY MAX(t1.Att_Sub)
FOR XML PATH('Other'),ROOT('OtherData'),TYPE)
FOR XML PATH('MainData')
____________________________________________________
Deja View - The strange feeling that somewhere, sometime you've optimised this query before
How to get the best help on a forum
http://www.sqlservercentral.com/articles/Best+Practices/61537February 27, 2012 at 9:47 am
Wonderful, thank you very much for your time and assistance.
I had just found the section within my copy of "Programming Microsoft SQL Server 2008", and although I could see it consisted of subqueries I just couldn't get my head around it correctly. I was getting a bit tired of seeing "invalid syntax near ','" and suchlike.
Thank you.
Viewing 3 posts - 1 through 3 (of 3 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy