Link to home
Create AccountLog in
Avatar of realcoding
realcodingFlag for United States of America

asked on

selecting XML from sql2005


 
CREATE TABLE [dbo].[Project](
	[ProjectId] [int] NOT NULL,
	[ProjectName] [nvarchar](255) ,
	[ParentProjectId] [int] null,
	[ReleaseId] [int] 
)

insert into Project values (1, 'Project 1', null, 1)
insert into Project values (2, 'Project 2', null, 1)
insert into Project values (3, 'project 3', 1, 1)
insert into Project values (4, 'project 4', 2, 1)



CREATE TABLE [dbo].[Release](
	[ReleaseId] [int] ,
	[Name] [nvarchar](255) ,
	[ReportingPriority] [int] 
)

insert into Release values (1, 'march release', 1)
insert into Release values (2, 'may release', 2)
insert into Release values (3, 'june release', 3)


CREATE TABLE [dbo].[ReleaseSchedule](
	[ReleaseScheduleID] [int] ,
	[ReleaseID] [int], 
	[EndDate] [datetime]
)

insert into ReleaseSchedule values (1, 1, '3/1/2010' )
insert into ReleaseSchedule values (2, 2, '5/1/2010' )
insert into ReleaseSchedule values (3, 3, '6/1/2010' )

Open in new window


this is the SQL data i have. from this i need to get a hierarchical XML that resembles this:

<Release Heading="releaseName" id="releaseID" EndDate="date">
  <Project Heading="projName" id="projectID">
    <SubProject Heading="subprojName" id="projectID"/>
    <SubProject Heading="subprojName" id="projectID"/>
  </Project>
  <Project Heading="releaseName" id="projectID">
    <SubProject Heading="subprojName" id="projectID"/>
  </Project>
</Release>

basically the logic is that each release has some projects to it, and projects can be nested with sub-projects (from the project table's self referencing data)
Avatar of Shaun Kline
Shaun Kline
Flag of United States of America image

Something like this?
select Name heading, ReleaseID id, EndDate enddate,
    (select projectname heading, projectid id, 
        (select projectname heading, projectid id 
         from project subproject 
         where subproject.parentprojectid = project.projectid 
         order by projectid for xml auto, type) 
     from project project
     where parentprojectid is null
        and project.ReleaseID = Release.ReleaseID
     order by projectid 
     for xml auto, type)
from (select Release.Name, Release.ReleaseID, ReleaseSchedule.EndDate
    from Release Release
    inner join ReleaseSchedule ReleaseSchedule on Release.ReleaseID = ReleaseSchedule.ReleaseID) Release
order by Release.ReleaseID
for xml auto

Open in new window

Avatar of realcoding

ASKER

yes, close but the code has the same problem the code i just made... there are dups all over !!!

i get many dups on release, project and sub-project nodes.

here is the code i have that produces similar results to the sample above (both have dup data all over in the xml)

SELECT 
    r.NAME AS '@Heading',
    r.ReleaseId AS '@id',
    rs.EndDate AS '@EndDate',
    (SELECT 
        p.ProjectName AS '@Heading',
        p.ProjectId AS '@id',
        (SELECT 
            p2.ProjectName AS '@Heading',
            p2.ProjectId AS '@id'
         FROM dbo.Project p2
         WHERE p2.ParentProjectId = p.projectId
		 ORDER BY p2.ProjectName
         FOR XML PATH('SubProject'), TYPE
     )
     FROM dbo.Project p
     WHERE p.ReleaseId = r.ReleaseId and p.ParentProjectId is null
	 ORDER BY p.ProjectName
     FOR XML PATH('Project'), TYPE
    ) 
FROM dbo.Release r
INNER JOIN dbo.ReleaseSchedule rs ON r.ReleaseId = rs.ReleaseID
order by r.ReportingPriority
FOR XML PATH('Release'), ROOT('data')

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Shaun Kline
Shaun Kline
Flag of United States of America image

Link to home
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
See answer
great, sorry i needed a where clause and fixed everything cause my actual data is more complex than the sample.