Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Beispiel wird eine Mitarbeiter-ID und ein Mitarbeitername für jeden Mitarbeiter abgerufen. In der AdventureWorks2012-Datenbank kann die EmployeeID aus der Spalte "BusinessEntityID" in der Tabelle "Mitarbeiter" abgerufen werden. Mitarbeiternamen können aus der Tabelle "Person" abgerufen werden. Die Spalte "BusinessEntityID" kann verwendet werden, um die Tabellen zu verknüpfen.
Angenommen, Sie möchten, dass DIE FOR XML EXPLICIT-Transformation XML generiert, wie in den folgenden Beispielen dargestellt:
<Employee EmpID="1" >
<Name FName="Ken" LName="S??nchez" />
</Employee>
...
Da es zwei Ebenen in der Hierarchie gibt, würden Sie zwei SELECT Abfragen schreiben und UNION ALL anwenden. Dies ist die erste Abfrage, die Werte für das <Employee> Element und die zugehörigen Attribute abruft. Die Abfrage weist 1 als Tag Wert für das <Employee> Element und NULL als Parent zu, da es sich um das Element der obersten Ebene handelt.
SELECT 1 as Tag,
NULL as Parent,
E.BusinessEntityID AS [Employee!1!EmpID],
NULL as [Name!2!FName],
NULL as [Name!2!LName]
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID;
Dies ist die zweite Abfrage. Es ruft Werte für das <Name> Element ab. Es weist 2 als Tag Wert für das <Name>-Element zu und 1 als Parent-Tagwert, während <Employee> als übergeordnetes Element identifiziert wird.
SELECT 2 as Tag,
1 as Parent,
E.BusinessEntityID,
FirstName,
LastName
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID;
Sie kombinieren diese Abfragen mit UNION ALL, wenden FOR XML EXPLICIT an und geben die erforderliche ORDER BY Klausel an. Sie müssen das Rowset zuerst nach BusinessEntityID und dann nach Namen sortieren, damit die NULL-Werte im Namen zuerst angezeigt werden. Wenn Sie die folgende Abfrage ohne die FOR XML-Klausel ausführen, wird die universelle Tabelle generiert.
Dies ist die endgültige Abfrage:
SELECT 1 as Tag,
NULL as Parent,
E.BusinessEntityID as [Employee!1!EmpID],
NULL as [Name!2!FName],
NULL as [Name!2!LName]
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID
UNION ALL
SELECT 2 as Tag,
1 as Parent,
E.BusinessEntityID,
FirstName,
LastName
FROM HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID
ORDER BY [Employee!1!EmpID],[Name!2!FName]
FOR XML EXPLICIT;
Dies ist das Teilergebnis:
<Employee EmpID="1">
<Name FName="Ken" LName="S??nchez" />
</Employee>
<Employee EmpID="2">
<Name FName="Terri" LName="Duffy" />
</Employee>
...
Der erste SELECT gibt Namen für Spalten im resultierenden Rowset an. Diese Namen bilden zwei Spaltengruppen. Die Gruppe, die Tag Wert 1 im Spaltennamen hat, identifiziert Employee als Element und EmpID als Attribut. Die andere Spaltengruppe weist Tag einen Wert 2 in der Spalte auf und identifiziert <Name> als das Element und FName und LName als Attribute.
Die folgende Tabelle zeigt das partielle Rowset, das von der Abfrage generiert wird:
Tag Parent Employee!1!EmpID Name!2!FName Name!2!LName
--- ------ ---------------- ------------ ------------
1 NULL 1 NULL NULL
2 1 1 Ken S??nchez
1 NULL 2 NULL NULL
2 1 2 Terri Duffy
1 NULL 3 NULL NULL
2 1 3 Roberto Tamburello
...
So werden die Zeilen in der universellen Tabelle verarbeitet, um die resultierende XML-Struktur zu erzeugen:
Die erste Zeile identifiziert Tag den Wert 1. Daher wird die Spaltengruppe mit dem Tag Wert 1 identifiziert. Employee!1!EmpID Diese Spalte identifiziert Employee den Elementnamen. Anschließend wird ein <Employee> Element mit Attributen erstellt EmpID . Diesen Attributen werden entsprechende Spaltenwerte zugewiesen.
Die zweite Zeile weist den Tag Wert 2auf. Daher wird die Spaltengruppe, die den Tag Wert 2 im Spaltennamen , Name!2!FName, Name!2!LNamehat, identifiziert. Diese Spaltennamen identifizieren Name als Elementnamen. Ein <Name> Element wird erstellt, das die Attribute FName und LName hat. Die entsprechenden Spaltenwerte werden diesen Attributen zugewiesen. Diese Zeile identifiziert 1 als Parent. Dieses untergeordnete Element wird dem vorherigen <Employee> Element hinzugefügt.
Dieser Vorgang wird für die restlichen Zeilen im Rowset wiederholt. Beachten Sie die Wichtigkeit der Sortierung der Zeilen in der universellen Tabelle, damit FOR XML EXPLICIT das Rowset in der Reihenfolge verarbeiten und den gewünschten XML-Code generieren kann.