FOR XML (SQL Server)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di Azure

Una query SELECT restituisce i risultati sotto forma di set di righe. È possibile recuperare facoltativamente i risultati di una query SQL come codice XML specificando la clausola FOR XML nella query. È possibile usare la clausola FOR XML nelle query di livello principale e nelle sottoquery. La clausola FOR XML di livello principale può essere utilizzata solo nell'istruzione SELECT. Nelle sottoquery è possibile usare FOR XML nelle istruzioni INSERT, UPDATE e DELETE. È possibile usare FOR XML anche nelle istruzioni di assegnazione.

In una clausola FOR XML, è necessario specificare una delle modalità seguenti:

  • RAW
  • AUTO
  • EXPLICIT
  • PATH

Nella modalità RAW viene generato un singolo elemento <row> per ogni riga del set di righe restituito dall'istruzione SELECT. È possibile generare la gerarchia XML tramite la formulazione di query FOR XML nidificate.

Nella modalità AUTO, il codice XML risultante è nidificato tramite l'approccio euristico determinato dalla modalità con cui viene specificata l'istruzione SELECT. Il controllo sulla forma del codice XML generato è minimo. È possibile formulare query FOR XML nidificate che generano una gerarchia XML che esula dalla forma XML generata dall'approccio euristico della modalità AUTO.

La modalità EXPLICIT consente un maggiore controllo sulla forma del codice XML, grazie alla possibilità di combinare gli attributi e gli elementi che definiscono tale forma. È richiesto un formato specifico per il set di righe generato in seguito all'esecuzione della query, del quale viene quindi eseguito il mapping alla forma del codice XML. La modalità EXPLICIT consente di combinare elementi e attributi, di creare wrapper e proprietà complesse nidificate, di creare valori separati da spazi (ad esempio, l'attributo OrderID può includere un elenco di ID di ordine) e contenuti misti.

La formulazione di query nella modalità EXPLICIT può tuttavia essere complessa. Per generare le gerarchie, anziché utilizzare la modalità EXPLICIT è possibile utilizzare le nuove funzionalità di FOR XML, ad esempio la formulazione di query FOR XML nidificate in modalità RAW/AUTO/PATH e la direttiva TYPE. Le query FOR XML nidificate consentono di generare qualsiasi codice XML generabile tramite la modalità EXPLICIT. Per altre informazioni, vedere Utilizzo di query FOR XML nidificate e Direttiva TYPE nelle query FOR XML.

L'utilizzo congiunto della modalità PATH e delle funzionalità per le query FOR XML nidificate consente di ottenere lo stesso livello di versatilità della modalità EXPLICIT, ma in un modo più semplice.

Queste modalità sono valide solo per l'esecuzione della query per la quale sono state impostate e non influiscono sui risultati di eventuali query successive.

FOR XML non è valida per qualsiasi selezione utilizzata con una clausola FOR BROWSE.

Esempio

L'istruzione SELECT seguente recupera informazioni dalle tabelle Sales.Customer e Sales.SalesOrderHeader del database AdventureWorks2022 . La query seguente specifica la modalità AUTO nella clausola FOR XML :

USE AdventureWorks2022;
GO
SELECT Cust.CustomerID,
       OrderHeader.CustomerID,
       OrderHeader.SalesOrderID,
       OrderHeader.Status
FROM Sales.Customer Cust 
INNER JOIN Sales.SalesOrderHeader OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO;

Clausola FOR XML e nomi di server

Se un'istruzione SELECT con una clausola FOR XML specifica un nome in quattro parti nella query, il nome del server non viene restituito nel documento XML risultante quando la query viene eseguita nel computer locale. Viene tuttavia restituito come nome in quattro parti se la query viene eseguita in un server di rete.

Ad esempio, si consideri la query seguente:

SELECT TOP 1 LastName
  FROM ServerName.AdventureWorks2022.Person.Person
  FOR XML AUTO;

 

Server locale: se ServerName è un server locale, la query restituisce il testo seguente:

<AdventureWorks2022.Person.Person LastName="Achong" />  

 

Server di rete: se ServerName è un server di rete, la query restituisce il testo seguente:

<ServerName.AdventureWorks2022.Person.Person LastName="Achong" />

 

Evitare ambiguità: è possibile evitare questa ambiguità specificando l'alias seguente:

SELECT TOP 1 LastName
  FROM ServerName.AdventureWorks2022.Person.Person x
  FOR XML AUTO;

Con la risoluzione dell'ambiguità, la query restituisce ora il testo seguente:

<x LastName="Achong"/>

Vedi anche

Sintassi di base della clausola FOR XML
Utilizzo della modalità RAW con FOR XML
Usare la modalità AUTO con FOR XML
Utilizzo della modalità EXPLICIT con FOR XML
Utilizzare la modalità PATH con FOR XML
OPENXML (SQL Server)
Aggiungere spazi dei nomi alle query con WITH XMLNAMESPACES