FOR XML EXPLICIT can't get element 4 going

Hello all,

I'm trying to generate some XML directly from MS SQL with the
following code

SELECT 1 AS tag
, NULL AS parent
, NULL AS [GoogleCustomizations!1]
, NULL AS [Annotations!2]
, NULL AS [Annotation!3]
, NULL AS [Annotation!3!about]
, NULL AS [Annotation!3!score]
, NULL AS [Label!4]
, NULL AS [Label!4!name]
UNION
SELECT 2 AS tag
, 1 AS parent
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
UNION
SELECT TOP 50 3 AS tag
, 2 AS parent
, NULL
, NULL
, NULL
, 'www.' + domainName
, 1 -- score
, NULL
, NULL
FROM tbl_auDomainName
UNION
SELECT 4 AS tag
, 3 AS parent
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, '_cse_ad-o6lgdody'
FOR XML EXPLICIT

The XML it needs to create is as following

<GoogleCustomizations>
<Annotations>
<Annotation about="www.clickfind.com.au/*" score="1">
<Label name="_cse_ad-o6lgdody" />
</Annotation>
<Annotation about="www.lookle.com/*" score="1">
<Label name="_cse_ad-o6lgdody" />
</Annotation>
<Annotation about="www.sensis.com.au/*" score="1">
<Label name="_cse_ad-o6lgdody" />
</Annotation>
</Annotations>
</GoogleCustomizations>

It is currently creating

<GoogleCustomizations>
<Annotations>
<Annotation about="www.10000steps.org.au" score="1" />
<Annotation about="www.101fm.asn.au" score="1" />
<Annotation about="www.aao.gov.au" score="1">
<Label name="_cse_ad-o6lgdody" />
</Annotation>
</Annotations>
</GoogleCustomizations>

I cannot get my head around how I can get the label <Label
name="_cse_ad-o6lgdody" />
in each element. Does anyone know?

Thanks in advance.
Pacific Fox [ Mo, 07 Januar 2008 09:55 ] [ ID #1901693 ]

Re: FOR XML EXPLICIT can't get element 4 going

Pacific Fox (tacofleur [at] gmail.com) writes:
> The XML it needs to create is as following
>
><GoogleCustomizations>
> <Annotations>
> <Annotation about="www.clickfind.com.au/*" score="1">
> <Label name="_cse_ad-o6lgdody" />
> </Annotation>
> <Annotation about="www.lookle.com/*" score="1">
> <Label name="_cse_ad-o6lgdody" />
> </Annotation>
> <Annotation about="www.sensis.com.au/*" score="1">
> <Label name="_cse_ad-o6lgdody" />
> </Annotation>
> </Annotations>
></GoogleCustomizations>
>
> It is currently creating
>
><GoogleCustomizations>
> <Annotations>
> <Annotation about="www.10000steps.org.au" score="1" />
> <Annotation about="www.101fm.asn.au" score="1" />
> <Annotation about="www.aao.gov.au" score="1">
> <Label name="_cse_ad-o6lgdody" />
> </Annotation>
> </Annotations>
></GoogleCustomizations>
>
> I cannot get my head around how I can get the label <Label
> name="_cse_ad-o6lgdody" />
> in each element. Does anyone know?

This seems to do what you want:

SELECT 1 AS tag
, NULL AS parent
, NULL AS [GoogleCustomizations!1]
, NULL AS [Annotations!2]
, NULL AS [Annotation!3]
, NULL AS [Annotation!3!about]
, NULL AS [Annotation!3!score]
, NULL AS [Annotation!3!Label!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
, EmployeeID
, FirstName
, 1 -- score
, '_cse_ad-o6lgdody'
FROM Employees
FOR XML EXPLICIT



--
Erland Sommarskog, SQL Server MVP, esquel [at] sommarskog.se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/prodtechnol/sql/2005/downlo ads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodinfo/previousversions/books .mspx
Erland Sommarskog [ Mo, 07 Januar 2008 23:36 ] [ ID #1901699 ]

Re: FOR XML EXPLICIT can't get element 4 going

Hi, thanks for replying.

Unfortunately it creates the right structure, except for it not
creating the name="" attribute. It creates the following (only showing
Annotation elements)

<Annotation about="www.10000steps.org.au" score="1">
<Label>_cse_ad-o6lgdody</Label>
</Annotation>
<Annotation about="www.101fm.asn.au" score="1">
<Label>_cse_ad-o6lgdody</Label>
</Annotation>
<Annotation about="www.121money.com.au" score="1">
<Label>_cse_ad-o6lgdody</Label>
</Annotation>
<Annotation about="www.1300rubbish.com.au" score="1">
<Label>_cse_ad-o6lgdody</Label>
</Annotation>

While it should be

<Annotation about="www.10000steps.org.au" score="1">
<Label name="_cse_ad-o6lgdody"/>
</Annotation>

Thanks in advance.
taco.fleur [ Di, 08 Januar 2008 02:10 ] [ ID #1902653 ]

Re: FOR XML EXPLICIT can't get element 4 going

clickfind(tm) (taco.fleur [at] clickfind.com.au) writes:
> Unfortunately it creates the right structure, except for it not
> creating the name="" attribute. It creates the following (only showing
> Annotation elements)
>
><Annotation about="www.10000steps.org.au" score="1">
> <Label>_cse_ad-o6lgdody</Label>
> </Annotation>
> <Annotation about="www.101fm.asn.au" score="1">
> <Label>_cse_ad-o6lgdody</Label>
> </Annotation>
> <Annotation about="www.121money.com.au" score="1">
> <Label>_cse_ad-o6lgdody</Label>
> </Annotation>
> <Annotation about="www.1300rubbish.com.au" score="1">
> <Label>_cse_ad-o6lgdody</Label>
> </Annotation>
>
> While it should be
>
><Annotation about="www.10000steps.org.au" score="1">
> <Label name="_cse_ad-o6lgdody"/>
> </Annotation>

This was about driving me nuts, but I don't do FOR XML that often. I also
looked at XML PATH in SQL 2005, which they say is easier to use than
EXPLCIT. And indeed, it's dead simple:

SELECT EmployeeID AS [Annotation/ [at] score],
FirstName AS [Annotation/ [at] about],
'_cse_ad-o6lgdody' AS [Annotation/Label/ [at] name]
FROM Employees
FOR XML PATH(''), ROOT('Annotations')

Almost. You may not that your outermost tag is missing. I was not able
to figure out how to have a two-level root, but I think it may be possible
by nesting FOR XML queries.

Anyway, I was able to solve the problem with XML EXPLICIT. It does
pay off to read the manual:

In constructing the XML, the rows in the universal table are processed
in order. Therefore, to retrieve the correct children instances
associated with their parent, the rows in the rowset must be ordered so
that each parent node is immediately followed by its children.

With that in mind, here the query with the Employees table as a stand-in
for your table:

SELECT 1 AS tag
, NULL AS parent
, NULL AS [GoogleCustomizations!1]
, NULL AS [Annotations!2]
, NULL AS [Annotation!3]
, NULL AS [Annotation!3!about]
, NULL AS [Annotation!3!score]
, NULL AS [Annotation!3!Label!element]
, NULL AS [Label!4!Name]
UNION ALL
SELECT 2 AS tag
, 1 AS parent
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
UNION ALL
SELECT 3 AS tag
, 2 AS parent
, NULL
, NULL
, EmployeeID
, FirstName
, 1 -- score
, NULL
, NULL
FROM Employees
UNION ALL
SELECT 4 AS tag
, 3 AS parent
, NULL
, NULL
, EmployeeID
, FirstName
, 1 -- score
, NULL
, '_cse_ad-o6lgdody'
FROM Employees
ORDER BY [Annotation!3!about], tag
FOR XML EXPLICIT







--
Erland Sommarskog, SQL Server MVP, esquel [at] sommarskog.se

Books Online for SQL Server 2005 at
http://www.microsoft.com/technet/prodtechnol/sql/2005/downlo ads/books.mspx
Books Online for SQL Server 2000 at
http://www.microsoft.com/sql/prodinfo/previousversions/books .mspx
Erland Sommarskog [ Di, 08 Januar 2008 23:44 ] [ ID #1902657 ]

Re: FOR XML EXPLICIT can't get element 4 going

You're a champ!

I got it to work with your code, with one slight modification, see
final code below.

SELECT 1 AS tag
, NULL AS parent
, NULL AS [GoogleCustomizations!1]
, NULL AS [Annotations!2]
, NULL AS [Annotation!3]
, NULL AS [Annotation!3!about]
, NULL AS [Annotation!3!score]
, NULL AS [Annotation!3!Label!element]
, NULL AS [Label!4!Name]
UNION ALL
SELECT 2 AS tag
, 1 AS parent
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
UNION ALL
SELECT 3 AS tag
, 2 AS parent
, NULL
, NULL
, NULL
, domainName
, 1 -- score
, NULL
, NULL
FROM domainName
UNION ALL
SELECT 4 AS tag
, 3 AS parent
, NULL
, NULL
, NULL
, domainName
, 1 -- score
, NULL
, '_cse_ad-o6lgdody'
FROM domainName
ORDER BY [Annotation!3!about], tag
FOR XML EXPLICIT

Thanks a million! Anything I can help with in return?
Pacific Fox [ Mi, 09 Januar 2008 02:39 ] [ ID #1903546 ]
Datenbanken » comp.databases.ms-sqlserver » FOR XML EXPLICIT can't get element 4 going

Vorheriges Thema: Extracting Duplicates from SQL Server 2000
Nächstes Thema: DB2 Tutorial