2

im trying to generate xml in the following format:

<Root>
    <Domain>Abc</Domain>
    <Name>Xyz</Name>
    <Contents>
        <Content>
            <ID>1</ID>
            <Value>Test 1</Value>
            <Record ID="1">Test 1</Record>
        </Content>
        <Content>
            <ID>2</ID>
            <Value>Test 2</Value>
            <Record ID="2">Test 2</Record>
        </Content>
    </Contents>
</Root>

My query is as follows:

declare @TestTable table (ID int, Value varchar(100))

insert into @TestTable values (1,'Test 1')
insert into @TestTable values (2,'Test 2')

declare @Domain varchar(max)='Abc'
declare @Name varchar(max)='Xyz'

SELECT
1 AS Tag,
NULL AS Parent,
@Domain as 'Root!1!Domain!Element',
@Name as 'Root!1!Name!Element',
NULL as 'Contents!2!Element',
NULL as 'Content!3!ID!Element',
NULL as 'Content!3!Value!Element',
NULL as 'Content!3!Record!Element'

union

SELECT
2 AS Tag,
1 AS Parent,
NULL,NULL,NULL,NULL,NULL,NULL

union

select
3 as Tag,
2 as Parent,
NUll,NUll,NULL,
ID,Value,Value
from @TestTable

FOR XML EXPLICIT

my query does not produce the record tag completely, currently it is

<Record>Test 2</Record>

which should be as

<Record ID=2>Test 2</Record>

I tried all the possibilities but not getting the tag. Can anyone help me solving this issue.

2 Answers 2

0

I could not get the expected output from xml explicit, instead i used xml path and got the output. this is my updated query

SELECT 
       @Domain "Domain",
       @Name "Name",
(
SELECT 
       ID  "ID",
       Value   "Value",
       (select 
        ID "@ID",
        Value  as "text()"      
        FOR XML PATH('Record'), ELEMENTS, TYPE )       
FROM   @TestTable
FOR XML PATH ('Content'), TYPE, ROOT('Contents')
)
FOR XML PATH ('Root')

you are welcome to post the fix which uses xml explicit.

Sign up to request clarification or add additional context in comments.

Comments

0

Don't forget the ORDER BY when use FOR XML EXPLICIT.


SELECT
    1 AS Tag,
    NULL AS Parent,
    @Domain as 'Root!1!Domain!Element',
    @Name as 'Root!1!Name!Element',
    NULL as 'Contents!2!Element',
    NULL as 'Content!3!ID!Element',
    NULL as 'Content!3!Value!Element',
    NULL as 'Record!4!ID',
    NULL as 'Record!4!'

union

SELECT
    2 AS Tag,
    1 AS Parent,
    @Domain,NULL,NULL,NULL,NULL,NULL, null

union

select
    3 as Tag,
    2 as Parent,
    @Domain,NUll,NULL,
    ID,Value,null,null

    from @TestTable
union

select
    4 as Tag,
    3 as Parent,
    @Domain,NUll,NULL,
    ID,Value,ID,Value

    from @TestTable
ORDER BY    'Root!1!Domain!Element','Contents!2!Element','Content!3!ID!Element','Record!4!ID'

FOR XML EXPLICIT

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.