Freigeben über


Spalten mit Namen

Im Folgenden werden die spezifischen Bedingungen aufgeführt, unter denen Rowsetspalten mit einem Namen dem resultierenden XML-Code zugeordnet werden, wobei die Groß-/Kleinschreibung beachtet wird:

  • 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 einen Schrägstrich (/).

  • Mehrere Spalten verwenden dasselbe Präfix.

  • Eine Spalte hat einen anderen 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 (@PmId, Name) zurück. Im resultierenden XML wird dem entsprechenden <row> Element ein PmId-Attribut hinzugefügt, und ihm wird ein Wert von 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 vor allen anderen Knotentypen, z. B. Elementknoten und Textknoten, auf derselben Ebene auftreten 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  

Spaltenname beginnt nicht mit einem At-Zeichen (@)

Wenn der Spaltenname nicht mit einem At-Zeichen (@) beginnt, nicht einer der XPath-Knotentests ist und keine Schrägstriche (/) enthält, wird standardmäßig ein XML-Element erzeugt, das ein Unterelement des Zeilenelements ist, <row>.

Die folgende Abfrage gibt den Spaltennamen, das Ergebnis an. Daher wird dem <row> Element ein <result> untergeordnetes 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 "ManuWorkCenterInformation" für das XML an, das von der XQuery zurückgegeben wird, die für die Spalte "Anweisungen" des XML-Typs angegeben ist. Daher wird ein <ManuWorkCenterInformation> Element als untergeordnetes Element des <row> Elements 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:

<row>  
  <ProductModelID>7</ProductModelID>  
  <Name>HL Touring Frame</Name>  
  <ManuWorkCenterInformation>  
    <MI:Location ...LocationID="10" ...></MI:Location>  
    <MI:Location ...LocationID="20" ...></MI:Location>  
     ...  
  </ManuWorkCenterInformation>  
</row>  

Spaltenname beginnt nicht mit einem At-Zeichen (@) und enthält einen 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 mit '@' beginnt, wird er einem Attribut des Namensn-1-Elements zugeordnet.

Die folgende Abfrage gibt beispielsweise eine Mitarbeiter-ID und den Namen zurück, die als komplexes Element EmpName dargestellt sind, das einen Vor-, zweiten und Nachnamen 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 zum Erstellen von XML im PATH-Modus verwendet. Der Spaltenname, der Mitarbeiter-ID-Werte enthält, beginnt mit '@'. Daher wird dem <row> Element ein Attribut , EmpID, hinzugefügt. Alle anderen Spalten enthalten ein Schrägstrich ('/') im Spaltennamen, der die Hierarchie angibt. Der resultierende XML-Code verfügt über das <EmpName> untergeordnete Element unter dem <row>-Element, und das <EmpName>-Kindelement hat <First>, <Middle> und <Last> als untergeordnete Elemente.

<row EmpID="1">  
  <EmpName>  
    <First>Gustavo</First>  
    <Last>Achong</Last>  
  </EmpName>  
</row>  

Der zweite Name des Mitarbeiters ist null, und standardmäßig ist der Nullwert dem Fehlen des Elements oder Attributs zugeordnet. Wenn Elemente für die NULL-Werte generiert werden sollen, können Sie die ELEMENTS-Direktive mit XSINIL angeben, wie in dieser Abfrage dargestellt.

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 elementorientiertes XML. Daher hat die Angabe der ELEMENTS-Direktive in einer PATH-Modusabfrage keine Auswirkung. Wie im vorherigen Beispiel gezeigt, ist die ELEMENTS-Direktive jedoch mit XSINIL hilfreich, um Elemente für Nullwerte zu generieren.

Neben der ID und dem Namen ruft die folgende Abfrage eine Mitarbeiteradresse ab. Gemäß dem Pfad in den Spaltennamen für Adressspalten wird dem <Address> Element ein untergeordnetes <row> Element hinzugefügt, und die Adressdetails werden als Elementkinder 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 verwenden die Spalten "FirstName", "MiddleName" und "LastName" dasselbe Präfix "EmpName". Daher werden sie als untergeordnete Elemente des <EmpName> Elements hinzugefügt. Dies ist auch der Fall, wenn Sie das <Address> Element im vorherigen Beispiel erstellt haben.

Eine Spalte hat einen anderen Namen

Wenn eine Spalte mit einem anderen Namen dazwischen angezeigt wird, wird die Gruppierung getrennt, wie in der folgenden geänderten Abfrage dargestellt. Die Abfrage bricht die Gruppierung von "Vorname", "MiddleName" und "LastName" auf, wie in der vorherigen Abfrage angegeben, durch Hinzufügen von Adressspalten zwischen den Spalten "Vorname" und "MiddleName".

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 hat das <FirstName> untergeordnete Element, und das zweite <EmpName> Element hat die <MiddleName> und <LastName> untergeordneten Elemente.

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

Verwenden des PATH-Modus mit FOR XML