Colonne provviste di un nomeColumns with a Name

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)noDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse Di seguito vengono illustrate le condizioni specifiche in cui viene eseguito il mapping tra le colonne del set di righe provviste di nome e il codice XML risultante, con distinzione tra maiuscole e minuscole: The following are the specific conditions in which rowset columns with a name are mapped, case-sensitive, to the resulting XML:

  • Il nome di colonna inizia con un simbolo di chiocciola (@)The column name starts with an at sign (@).

  • Il nome di colonna non inizia con un simbolo di chiocciola (@)The column name does not start with an at sign (@).

  • Il nome di colonna non inizia con un simbolo di chiocciola (@) e contiene una barra (/)The column name does not start with an at sign@ and contains a slash mark (/).

  • Più colonne condividono lo stesso prefisso.Several columns share the same prefix.

  • Una colonna ha un nome diverso.One column has a different name.

Il nome di colonna inizia con un simbolo di chiocciola (@)Column Name Starts with an At Sign (@)

Se il nome della colonna inizia con un simbolo di chiocciola (@) e non contiene una barra (/), viene creato un attributo dell'elemento row con il valore di colonna corrispondente.If the column name starts with an at sign (@) and does not contain a slash mark (/), an attribute of the row element that has the corresponding column value is created. Ad esempio, la query seguente restituisce un set di righe a due colonne (@PmId, Name).For example, the following query returns a two-column (@PmId, Name) rowset. Nel codice XML risultante viene aggiunto un attributo PmId all'elemento row corrispondente e gli viene assegnato un valore di ProductModelID.In the resulting XML, a PmId attribute is added to the corresponding row element and a value of ProductModelID is assigned to it.


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

Risultato:This is the result:

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

Si noti che gli attributi devono precedere qualsiasi altro tipo di nodo presente nello stesso livello, ad esempio nodi di elemento e di testo.Note that attributes must come before any other node types, such as element nodes and text nodes, in the same level. La query seguente restituirà un errore:The following query will return an error:

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

Il nome di colonna non inizia con un simbolo di chiocciola (@)Column Name Does Not Start with an At Sign (@)

Se il nome di colonna non inizia con un simbolo di chiocciola (@), non è uno dei test di nodo XPath e non contiene una barra (/), viene creato un elemento XML che è un sottoelemento dell'elemento riga, per impostazione predefinita row.If the column name does not start with an at sign (@), is not one of the XPath node tests, and does not contain a slash mark (/), an XML element that is a subelement of the row element, row by default, is created.

La query seguente specifica il nome della colonna, il risultato.The following query specifies the column name, the result. Un elemento figlio result viene pertanto aggiunto all'elemento row.Therefore, a result element child is added to the row element.

SELECT 2+2 as result  
for xml PATH  

Risultato:This is the result:

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

La query seguente specifica il nome della colonna, ManuWorkCenterInformation, per il codice XML restituito dall'espressione XQuery specificata sulla colonna Instructions di tipo xml.The following query specifies the column name, ManuWorkCenterInformation, for the XML returned by the XQuery specified against Instructions column of xml type. Un elemento ManuWorkCenterInformation viene pertanto aggiunto come figlio dell'elemento row.Therefore, a ManuWorkCenterInformation element is added as a child of the row element.

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   
go  

Risultato:This is the result:

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

Il nome di colonna non inizia con un simbolo di chiocciola (@) e contiene una barra (/)Column Name Does Not Start with an At Sign (@) and Contains a Slash Mark (/)

Se il nome di colonna non inizia con un simbolo di chiocciola (@), ma contiene una barra (/), il nome della colonna indica una gerarchia XML.If the column name does not start with an at sign (@), but contains a slash mark (/), the column name indicates an XML hierarchy. Ad esempio, se il nome della colonna è "Name1/Name2/Name3.../Namen ", ogni Namei rappresenta un nome di elemento nidificato nell'elemento di riga corrente (per i=1) o che si trova sotto l'elemento il cui nome è Namei-1.For example, if the column name is "Name1/Name2/Name3.../Namen ", each Namei represents an element name that is nested in the current row element (for i=1) or that is under the element that has the name Namei-1. Se Namen inizia con il simbolo @, viene eseguito il mapping a un attributo dell'elemento Namen-1 .If Namen starts with '@', it is mapped to an attribute of Namen-1 element.

Ad esempio, la query seguente restituisce l'ID e il nome di un dipendente rappresentati come un elemento complesso EmpName che contiene nome, secondo nome e cognome.For example, the following query returns an employee ID and name that are represented as a complex element EmpName that contains a First, Middle, and Last name.

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  

I nomi di colonna vengono usati come un percorso nella creazione del codice XML in modalità PATH.The column names are used as a path in constructing XML in the PATH mode. Il nome della colonna che contiene i valori ID dipendente inizia con il simbolo '@'. Viene pertanto aggiunto un attributo EmpID all'elemento row.The column name that contains employee ID values, starts with '@'.Therefore, an attribute, EmpID, is added to the row element. I nomi di tutte le altre colonne contengono una barra ("/"), che indica la gerarchia.All other columns include a slash mark ('/') in the column name that indicates hierarchy. Il codice XML risultante avrà l'elemento figlio EmpName sotto l'elemento row e l'elemento figlio EmpName avrà gli elementi figlio First, Middle e Last.The resulting XML will have the EmpName child under the row element, and the EmpName child will have First, Middle and Last element children.

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

Il valore del secondo nome del dipendente è Null e, per impostazione predefinita, il valore Null corrisponde all'assenza dell'elemento o attributo.The employee middle name is null and, by default, the null value maps to the absence of the element or attribute. Se si desidera la generazione di elementi per i valori NULL, è possibile specificare la direttiva ELEMENTS con XSINIL, come illustrato in questa query.If you want elements generated for the NULL values, you can specify the ELEMENTS directive with XSINIL as shown in this query.

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  

Risultato:This is the result:

<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>  

Per impostazione predefinita, la modalità PATH genera XML incentrato sugli elementi.By default, the PATH mode generates element-centric XML. Specificare la direttiva ELEMENTS in una query in modalità PATH pertanto non produce effetti.Therefore, specifying the ELEMENTS directive in a PATH mode query has no effect. Come illustrato nell'esempio precedente tuttavia, la direttiva ELEMENTS risulta utile con XSINIL per la generazione di elementi per i valori Null.However, as shown in the previous example, the ELEMENTS directive is useful with XSINIL to generate elements for null values.

Oltre all'ID e al nome, la query seguente recupera l'indirizzo di un dipendente.Besides the ID and name, the following query retrieves an employee address. Come per il percorso nei nomi di colonna per le colonne degli indirizzi, un elemento figlio Address viene aggiunto all'elemento row e i dettagli relativi agli indirizzi vengono aggiunti come elementi figlio dell'elemento Address.As per the path in the column names for address columns, an Address element child is added to the row element and the address details are added as element children of the Address element.

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  

Risultato:This is the result:

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

Più colonne condividono lo stesso prefisso di percorsoSeveral Columns Share the Same Path Prefix

Se più colonne successive condividono lo stesso prefisso di percorso, vengono raggruppate sotto lo stesso nome.If several subsequent columns share the same path prefix, they are grouped together under the same name. Se vengono utilizzati prefissi degli spazi dei nomi diversi, anche se associati allo stesso spazio dei nomi, un percorso viene considerato diverso.If different namespace prefixes are being used even if they are bound to the same namespace, a path is considered different. Nella query precedente le colonne FirstName, MiddleName e LastName condividono lo stesso prefisso EmpName. Vengono pertanto aggiunte come elementi figlio dell'elemento EmpName.In the previous query, the FirstName, MiddleName, and LastName columns share the same EmpName prefix.Therefore, they are added as children of the EmpName element. Ciò si verifica anche nell'esempio precedente, nella fase di creazione dell'elemento Address.This is also the case when you were creating the Address element in the previous example.

Una colonna ha un nome diversoOne Column Has a Different Name

Se è presente una colonna con un nome diverso, interromperà il raggruppamento, come illustrato nella query modificata seguente.If a column with a different name appears in between, it will break the grouping, as shown in the following modified query. La query interrompe il raggruppamento di FirstName, MiddleName e LastName, come specificato nella query precedente, aggiungendo colonne di indirizzi fra le colonne FirstName e MiddleName.The query breaks the grouping of FirstName, MiddleName, and LastName, as specified in the previous query, by adding address columns in between the FirstName and MiddleName columns.

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  

Di conseguenza, la query crea due elementi EmpName.As a result, the query creates two EmpName elements. Il primo elemento EmpName ha l'elemento figlio FirstName e il secondo elemento EmpName ha gli elementi figlio MiddleName e LastName.The first EmpName element has the FirstName element child and the second EmpName element has the MiddleName and LastName element children.

Risultato:This is the result:

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

Vedere ancheSee Also

Utilizzare la modalità PATH con FOR XMLUse PATH Mode with FOR XML