2016-04-27 3 views
3

ich eine Tabellenstruktur wie unten haben:Wie Attribut Wurzelknoten in xml hinzufügen sql

SELECT 
    [EmpID], [EmpName], 
    [DeptName], 
    [BirthDate] 
FROM 
    [dbo].[Employees] 

Ich möchte diese Tabellendaten in XML konvertieren und die endgültige Ausgabe wird wie unten sein:

<Employees DeptName="ABC">  
    <Employee EmpID="1"> 
    <EmpName>Davolio</EmpName> 
    <BirthDate>10/12/1989</BirthDate> 
    </Employee> 
    <Employee EmpID="2"> 
    <EmpName>Andrew</EmpName>  
    <BirthDate>05/02/1985</BirthDate> 
    </Employee>  
    <Employee EmpID="3"> 
    <EmpName>David</EmpName> 
    <BirthDate>11/09/1982</BirthDate> 
    </Employee> 
</Employees> 
+0

Plz fügen Sie einen weiteren DeptName in der Beispiel-XML hinzu, um die vollständige Struktur zu erhalten. (zB AbtName = "DEF" und Mitarbeiter) –

+0

Ich möchte nur Attribut für Root-Knoten hinzufügen und dieser Attributwert kann statisch sein oder Dummy-Text .. (nicht nur Abt. Name) –

Antwort

2

Dies sollte Sie bekommen, was Sie brauchen:

CREATE TABLE dbo.Employees(EmpID INT,EmpName VARCHAR(100),DeptName VARCHAR(100),BirthDate DATE); 
INSERT INTO dbo.Employees VALUES 
(1,'Test1','Dep1',{d'1991-01-01'}) 
,(2,'Test2','Dep1',{d'1992-02-02'}) 
,(3,'Test3','Dep2',{d'1993-03-03'}); 
GO 

WITH DistinctDepartments AS 
(
    SELECT DISTINCT DeptName FROM dbo.Employees 
) 
SELECT DeptName AS [@DeptName] 
     ,(
     SELECT 
     innerEmp.[EmpID] AS [@EmpId] 
     ,innerEmp.[EmpName] 
     ,innerEmp.[BirthDate] 
     FROM [dbo].Employees AS innerEmp 
     WHERE innerEmp.DeptName=DistinctDepartments.DeptName 
     FOR XML PATH('Employee'),TYPE 
     ) 
FROM DistinctDepartments 
FOR XML PATH('Employees'),ROOT('Departments'); 

Das Ergebnis

<Departments> 
    <Employees DeptName="Dep1"> 
    <Employee EmpId="1"> 
     <EmpName>Test1</EmpName> 
     <BirthDate>1991-01-01</BirthDate> 
    </Employee> 
    <Employee EmpId="2"> 
     <EmpName>Test2</EmpName> 
     <BirthDate>1992-02-02</BirthDate> 
    </Employee> 
    </Employees> 
    <Employees DeptName="Dep2"> 
    <Employee EmpId="3"> 
     <EmpName>Test3</EmpName> 
     <BirthDate>1993-03-03</BirthDate> 
    </Employee> 
    </Employees> 
</Departments> 
+0

Danke Shnugo für die Antwort .. Aber ich nicht Abteilungen Tag benötigen, so dass die unter einem fein ist für mich MIT DistinctDepartments AS ( DISTINCT DEPTNAME VON dbo.Employees SELECT ) SELECT DEPTNAME AS [@DeptName] ( SELECT innerEmp. [EmpID] AS [@EmpId] , innerEmp. [EmpName] , innerEmp. [Geburtsdatum] FROM [dbo] .Mitarbeiter AS innerEmp WHERE innerEmp.DeptName = DistinctDepartments.DeptName FOR XML PATH ('Mitarbeiter'), TYPE ) FROM DistinctDepartments FOR XML PATH ('Mitarbeiter') –