Freigeben über


Spalten mit Namen

Im Folgenden werden die spezifischen Bedingungen aufgeführt, unter denen dem XML-Ergebnis mit Unterscheidung nach Groß-/Kleinschreibung Rowsetspalten mit Namen zugeordnet werden:

  • Der Spaltenname beginnt mit einem @-Zeichen.

  • Der Spaltenname beginnt nicht mit einem @-Zeichen.

  • Der Spaltenname beginnt nicht mit einem @-Zeichen und enthält einen Schrägstrich (/).

  • Mehrere Spalten verwenden dasselbe Präfix.

  • Eine Spalte hat einen unterschiedlichen Namen.

Der Spaltenname beginnt mit einem @-Zeichen

Wenn der Spaltenname mit einem @-Zeichen beginnt und keinen Schrägstrich (/) enthält, wird ein Attribut für das <row>-Element mit dem entsprechenden Spaltenwert erstellt. Die folgende Abfrage gibt beispielsweise ein Rowset mit zwei Spalten (@PmId, Name) zurück. Im resultierenden XML-Code wird dem entsprechenden <row>-Element ein PmId-Attribut hinzugefügt und diesem ein Wert aus ProductModelID zugewiesen.

SELECT ProductModelID as "@PmId",
       Name
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH;
GO

Dies ist das Ergebnis:

<row PmId="7">

<Name>HL Touring Frame</Name>

</row>

Beachten Sie, dass Attribute allen anderen Knotentypen, wie z. B. Elementknoten und Textknoten, auf derselben Ebene vorangestellt sein müssen. Die folgende Abfrage gibt einen Fehler zurück:

SELECT Name,
       ProductModelID as "@PmId"
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH ;
GO

Der Spaltenname beginnt nicht mit einem @-Zeichen

Wenn der Spaltenname nicht mit einem @-Zeichen beginnt, kein XPath-Knotentest ist und keinen Schrägstrich (/) enthält, wird ein XML-Element als Unterelement des Zeilenelements (standardmäßig <row>) erstellt.

Die folgende Abfrage gibt den Spaltennamen result an. Folglich wird dem <row>-Element ein untergeordnetes <result>-Element hinzugefügt.

SELECT 2+2 as result
for xml PATH

Dies ist das Ergebnis:

<Zeile (row)>

<result>4</result>

</row>

Die folgende Abfrage gibt den Spaltennamen ManuWorkCenterInformation für den XML-Code an, der von der für die Instructions-Spalte vom xml-Typ angegebenen XQuery zurückgegeben wurde. Folglich wird dem <row>-Element ein untergeordnetes <ManuWorkCenterInformation>-Element hinzugefügt.

SELECT 
       ProductModelID,
       Name,
       Instructions.query('declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
                /MI:root/MI:Location 
              ') as ManuWorkCenterInformation
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH; 
GO

Dies ist das Ergebnis:

<Zeile (row)>

<ProductModelID>7</ProductModelID>

<Name>HL Touring Frame</Name>

<ManuWorkCenterInformation>

<MI:Location ...LocationID="10" ...></MI:Location>

<MI:Location ...LocationID="20" ...></MI:Location>

...

</ManuWorkCenterInformation>

</row>

Der Spaltenname beginnt nicht mit einem @-Zeichen und enthält einen Schrägstrich (/)

Wenn der Spaltenname nicht mit einem @-Zeichen beginnt, jedoch einen Schrägstrich (/) enthält, zeigt der Spaltenname eine XML-Hierarchie. Lautet der Spaltenname beispielsweise "Name1/Name2/Name3.../Namen", repräsentiert jeder Namei einen im aktuellen Zeilenelement geschachtelten Elementnamen (für i=1) oder einen Elementnamen, der sich unter dem Element mit dem Namen i-1 befindet. Wenn Namen mit einem @-Zeichen beginnt, wird er einem Attribut des Namen-1-Elements zugeordnet.

Die folgende Abfrage gibt beispielsweise die ID (BusinessEntityID) und den Namen eines Mitarbeiters als komplexes Element EmpName zurück, welches zwei Vornamen und einen Nachnamen enthält (FirstName, MiddleName, LastName).

SELECT BusinessEntityID "@EmpID", 
       FirstName  "EmpName/First", 
       MiddleName "EmpName/Middle", 
       LastName   "EmpName/Last"
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON  E.BusinessEntityIDID = P.BusinessEntityIDID
WHERE  E.BusinessEntityID=4
FOR XML PATH;

Die Spaltennamen werden als Pfad für die Konstruktion des XML-Codes im PATH-Modus verwendet. Der Name der Spalte, die die ID-Werte der Mitarbeiter enthält, beginnt mit einem @-Zeichen. Folglich wird dem <row>-Element ein EmpID-Attribut hinzugefügt. Alle anderen Spalten enthalten einen eine Hierarchie aufzeigenden Schrägstrich (/) im Spaltennamen. Der resultierende XML-Code weist ein untergeordnetes <EmpName>-Element unter dem <row>-Element auf. Das untergeordnete <EmpName>-Element besitzt seinerseits die untergeordneten Elemente <First>, <Middle> und <Last>.

<row EmpID="4">

<EmpName>

<First>Rob</First>

<Last>Walters</Last>

</EmpName>

</row>

Der zweite Vorname des Mitarbeiters ist ein NULL-Wert, welcher standardmäßig der Abwesenheit eines Elements oder Attributs zugeordnet ist. Wenn Sie jedoch möchten, dass für NULL-Werte Elemente generiert werden, können Sie die ELEMENTS-Direktive mit XSINIL angeben, wie in der folgenden Abfrage gezeigt.

SELECT E.BusinessEntityID "@EmpID", 
       FirstName  "EmpName/First", 
       MiddleName "EmpName/Middle", 
       LastName   "EmpName/Last"
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P
ON E.BusinessEntityID = P.BusinessEntityID 
WHERE E.BusinessEntityID=4
FOR XML PATH, ELEMENTS XSINIL;

Dies ist das Ergebnis:

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

EmpID="4">

<EmpName>

<First>Rob</First>

<Middle xsi:nil="true"/>

<Last>Walters</Last>

</EmpName>

</row>

Standardmäßig generiert der PATH-Modus elementzentrierten XML-Code. Daher hat die Angabe der ELEMENTS-Direktive in einer Abfrage im PATH-Modus keine Wirkung. Die ELEMENTS-Direktive erweist sich jedoch in Verbindung mit XSINIL als nützlich, um Elemente für NULL-Werte zu generieren.

Die folgende Abfrage ruft außer der ID und dem Namen die Adresse eines Mitarbeiters ab. Gemäß dem Pfad in den Spaltennamen für Adressspalten wird dem <row>-Element ein untergeordnetes <Address>-Element hinzugefügt, und die Adressdetails werden als untergeordnetes Element des <Address>-Elements hinzugefügt.

SELECT E.BusinessEntityID   "@EmpID", 
       FirstName    "EmpName/First", 
       MiddleName   "EmpName/Middle", 
       LastName     "EmpName/Last",
       AddressLine1 "Address/AddrLine1",
       AddressLine2 "Address/AddrLIne2",
       City         "Address/City"
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P ON E.BusinessEntityID = P.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress AS BEA 
    ON BEA.BusinessEntityID = P.BusinessEntityID
INNER JOIN Person.Address AS A ON A.AddressID = BEA.AddressID
WHERE E.BusinessEntityID = 4
FOR XML PATH

Dies ist das Ergebnis:

<row EmpID="4">
  <EmpName>
    <First>Rob</First>
    <Last>Walters</Last>
  </EmpName>
  <Address>
    <AddrLine1>5678 Lakeview Blvd.</AddrLine1>
    <City>Minneapolis</City>
  </Address>
</row>

Mehrere Spalten verwenden dasselbe Pfadpräfix

Wenn mehrere aufeinander folgende Spalten dasselbe Pfadpräfix gemeinsam haben, werden sie unter demselben Namen gruppiert. Werden verschiedene Namespacepräfixe verwendet, wird ein Pfad als verschieden betrachtet, auch wenn die Präfixe an denselben Namespace gebunden sind. In der vorherigen Abfrage haben die FirstName-, MiddleName- und LastName-Spalte das Präfix EmpName gemeinsam. Daher werden sie dem <EmpName>-Element als untergeordnete Elemente hinzugefügt. Dies ist auch für das <Address>-Element, das Sie im vorherigen Beispiel erstellt haben, der Fall.

Eine Spalte hat einen unterschiedlichen Namen

Wenn eine Spalte in einer Reihe von Spalten einen anderen Namen aufweist, wird die Gruppierung unterbrochen, wie in der folgenden, geänderten Abfrage gezeigt. Die Abfrage unterbricht die Gruppierung von FirstName, MiddleName und LastName, die in der vorherigen Abfrage angegeben waren, durch Hinzufügen der Adressspalten zwischen der FirstName- und der MiddleName-Spalte.

SELECT E.BusinessEntityID   "@EmpID", 
       FirstName    "EmpName/First", 
       AddressLine1 "Address/AddrLine1",
       AddressLine2 "Address/AddrLine2",
       City         "Address/City",
       MiddleName   "EmpName/Middle", 
       LastName     "EmpName/Last"
FROM   HumanResources.Employee AS E
INNER JOIN Person.Person AS P ON E.BusinessEntityID = P.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress AS BEA 
    ON BEA.BusinessEntityID = P.BusinessEntityID
INNER JOIN Person.Address AS A ON A.AddressID = BEA.AddressID
WHERE E.BusinessEntityID = 4
FOR XML PATH;

Folglich erstellt die Abfrage zwei <EmpName>-Elemente. Das erste <EmpName>-Element besitzt als untergeordnetes Element <FirstName> und das zweite <EmpName>-Element <MiddleName> und <LastName>.

Dies ist das Ergebnis:

<row EmpID="4">

<EmpName>

<First>Rob</First>

</EmpName>

<Adresse>

<AddrLine1>5678 Lakeview Blvd.</AddrLine1>

<City>Minneapolis</City>

</Address>

<EmpName>

<Last>Walters</Last>

</EmpName>

</row>

Siehe auch

Konzepte