Spalten mit einem Namen

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

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 At-Zeichen (@).

  • Der Spaltenname beginnt nicht mit einem At-Zeichen (@).

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

  • Mehrere Spalten verwenden dasselbe Präfix.

  • Eine Spalte hat einen unterschiedlichen Namen.

Spaltenname beginnt mit einem At-Zeichen (@)

Wenn der Spaltenname mit einem At-Zeichen (@) beginnt und kein Schrägstrich (/) enthält, wird ein Attribut des row Elements mit dem entsprechenden Spaltenwert erstellt. Die folgende Abfrage gibt z. B. ein Zeilensatz mit zwei Spalten zurück@PmId, Name. Im resultierenden XML-Code wird dem entsprechenden Element ein PmId Attribut hinzugefügt und ihm ein Wert ProductModelID zugewiesen.row

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

Dies ist das Ergebnis:

<row PmId="7">
  <Name>HL Touring Frame</Name>
</row>

Attribute müssen vor allen anderen Knotentypen, z. B. Elementknoten und Textknoten, auf derselben Ebene erfolgen. Die folgende Abfrage gibt einen Fehler zurück:

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

Der Spaltenname beginnt nicht mit einem At-Zeichen (@)

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

Die folgende Abfrage gibt den Spaltennamen result an. Folglich wird dem row-Element das untergeordnete result-Element hinzugefügt.

SELECT 2 + 2 as result
for xml PATH;

Dies ist das Ergebnis:

<row>
  <result>4</result>
</row>

Die folgende Abfrage gibt den Spaltennamen ManuWorkCenterInformationfür den von der XQuery angegebenen XML-Code für Instructions die Spalte des XML-Typs an. Folglich wird dem row-Element das untergeordnete ManuWorkCenterInformation-Element hinzugefügt.

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

Dies ist das Ergebnis:

<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 At-Zeichen (@) und enthält ein Schrägstrich (/)

Wenn der Spaltenname nicht mit einem At-Zeichen (@) beginnt, aber ein Schrägstrich (/) enthält, gibt der Spaltenname eine XML-Hierarchie an. Wenn der Spaltenname beispielsweise "Name1/Name2/Name3.../Namen" lautet, stellt jeder Namei einen Elementnamen dar, der im aktuellen Zeilenelement (für i = 1) geschachtelt ist oder sich unter dem Element befindet, das den Namen "i-1" aufweist. Wenn Namen beginnt, @wird er einem Attribut des Namensn-1-Elements zugeordnet.

Die folgende Abfrage gibt z. B. eine Mitarbeiter-ID und einen Namen zurück, die als komplexes Element EmpName dargestellt werden, das ein First, Middleund Last einen Namen enthält.

SELECT EmployeeID "@EmpID",
       FirstName  "EmpName/First",
       MiddleName "EmpName/Middle",
       LastName   "EmpName/Last"
FROM   HumanResources.Employee E, Person.Contact C
WHERE  E.EmployeeID = C.ContactID  AND
       E.EmployeeID = 1
FOR XML PATH;

Die Spaltennamen werden als Pfad für die Konstruktion des XML-Codes im PATH-Modus verwendet. Der Spaltenname, der Mitarbeiter-ID-Werte enthält, beginnt mit '@'. Daher wird dem row Element ein Attribut EmpIDhinzugefügt. Alle anderen Spalten enthalten ein Schrägstrich (/) im Spaltennamen, der die Hierarchie angibt. Im resultierenden XML-Code befindet sich das untergeordnete EmpName-Element unter dem row-Element, und das untergeordnete EmpName-Element verfügt über die untergeordneten Elemente First, Middle und Last.

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
    <Last>Achong</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 EmployeeID "@EmpID",
       FirstName  "EmpName/First",
       MiddleName "EmpName/Middle",
       LastName   "EmpName/Last"
FROM   HumanResources.Employee E, Person.Contact C
WHERE  E.EmployeeID = C.ContactID  AND
       E.EmployeeID = 1
FOR XML PATH, ELEMENTS XSINIL;

Dies ist das Ergebnis:

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      EmpID="1">
  <EmpName>
    <First>Gustavo</First>
    <Middle xsi:nil="true" />
    <Last>Achong</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. Entsprechend dem Pfad in den Spaltennamen für Adressspalten wird dem row-Element ein untergeordnetes Address-Element hinzugefügt, und die Adressdetails werden als untergeordnete Elemente des Address-Elements hinzugefügt.

SELECT EmployeeID   "@EmpID",
       FirstName    "EmpName/First",
       MiddleName   "EmpName/Middle",
       LastName     "EmpName/Last",
       AddressLine1 "Address/AddrLine1",
       AddressLine2 "Address/AddrLIne2",
       City         "Address/City"
FROM   HumanResources.Employee E,
       Person.Contact C,
       Person.Address A
WHERE  E.EmployeeID = C.ContactID
AND    E.AddressID = A.AddressID
AND    E.EmployeeID = 1
FOR XML PATH;

Dies ist das Ergebnis:

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
    <Last>Achong</Last>
  </EmpName>
  <Address>
    <AddrLine1>7726 Driftwood Drive</AddrLine1>
    <City>Monroe</City>
  </Address>
</row>

Mehrere Spalten verwenden dasselbe Pfadpräfix

Wenn mehrere nachfolgende Spalten dasselbe Pfadpräfix aufweisen, werden sie unter demselben Namen gruppiert. Wenn verschiedene Namespacepräfixe verwendet werden, auch wenn sie an denselben Namespace gebunden sind, wird ein Pfad als unterschiedlich betrachtet. In der vorherigen Abfrage teilen sich die Spalten , und die FirstName, MiddleNameund LastName die Spalten dasselbe EmpName Präfix. Daher werden sie als untergeordnete Elemente des EmpName Elements hinzugefügt. Dies war auch der Fall, als Sie das Address-Element im vorherigen Beispiel erstellt haben.

Eine Spalte hat einen anderen 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 umbricht die Gruppierung von FirstName, MiddleNameund LastName, wie in der vorherigen Abfrage angegeben, durch Hinzufügen von Adressspalten zwischen den FirstName Spalten und MiddleName spalten.

SELECT EmployeeID "@EmpID",
       FirstName "EmpName/First",
       AddressLine1 "Address/AddrLine1",
       AddressLine2 "Address/AddrLIne2",
       City "Address/City",
       MiddleName "EmpName/Middle",
       LastName "EmpName/Last"
FROM   HumanResources.EmployeeAddress E,
       Person.Contact C,
       Person.Address A
WHERE  E.EmployeeID = C.ContactID
AND    E.AddressID = A.AddressID
AND    E.EmployeeID = 1
FOR XML PATH;

Daher erstellt die Abfrage zwei EmpName-Elemente. Das erste EmpName-Element verfügt über das untergeordnete FirstName-Element, und das zweite EmpName-Element verfügt über die untergeordneten Elemente MiddleName und LastName.

Dies ist das Ergebnis:

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
  </EmpName>
  <Address>
    <AddrLine1>7726 Driftwood Drive</AddrLine1>
    <City>Monroe</City>
  </Address>
  <EmpName>
    <Last>Achong</Last>
  </EmpName>
</row>

Siehe auch