TYPE direttiva nelle query FOR XML

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di Azure SQLDatabase SQL in Microsoft Fabric

SQL Server supporto per il tipo di dati xml (Transact-SQL) consente di richiedere facoltativamente che il risultato di una query FOR XML venga restituito come xml specificando la TYPE direttiva . In questo modo è possibile elaborare il risultato di una query FOR XML sul server. Ad esempio, è possibile specificare un'espressione XQuery per la query FOR XML, assegnare il risultato a una variabile di tipo xml oppure scrivere query FOR XML annidate.

Nota

SQL Server restituisce dati dell'istanza del tipo di dati xml al client in seguito a costrutti server diversi, ad esempio query FOR XML che usano la TYPE direttiva o in cui viene usato il tipo di dati xml per restituire i valori dei dati dell'istanza XML dalle colonne della tabella SQL e dai parametri di output. Nel codice delle applicazioni client, il provider ADO.NET richiede che le informazioni sui tipi di dati xml vengano inviate dal server in codifica binaria. Tuttavia, se si usa FOR XML senza la TYPE direttiva , i dati XML vengono restituiti come tipo stringa. In tutti i casi, il provider client sarà sempre in grado di gestire entrambe i formati di XML. Si noti che non è possibile utilizzare la direttiva FOR XML di primo livello senza la TYPE direttiva con i cursori.

Esempi

Negli esempi seguenti viene illustrato l'uso della direttiva TYPE nelle query FOR XML.

Recupero dei risultati di una query FOR XML come tipo xml

La query seguente recupera le informazioni di contatto del cliente dalla tabella Contacts . Poiché la direttiva TYPE è specificata in FOR XML, il risultato viene restituito come tipo xml .

USE AdventureWorks2022;
Go
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
ORDER BY BusinessEntityID
FOR XML AUTO, TYPE;

Risultato parziale:

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez"/>
<Person.Person BusinessEntityID="2" FirstName="Terri" LastName="Duffy"/>
...

Assegnazione dei risultati di una query FOR XML a una variabile di tipo xml

Nell'esempio seguente un risultato FOR XML è assegnato a una variabile di tipo xml , @x. La query recupera le informazioni di contatto, ad esempio BusinessEntityID, FirstName, LastName, e i numeri di telefono aggiuntivi dalla colonna AdditionalContactInfo di tipo xmlTYPE. Poiché la clausola FOR XML specifica la direttiva TYPE , il codice XML viene restituito come tipo xml e assegnato a una variabile.

USE AdventureWorks2022;
GO
DECLARE @x xml;
SET @x = (
   SELECT BusinessEntityID,
          FirstName,
          LastName,
          AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
              //act:telephoneNumber/act:number') as MorePhoneNumbers
   FROM Person.Person
   FOR XML AUTO, TYPE);
SELECT @x;
GO

Interrogazione dei risultati di una query FOR XML

La query FOR XML restituisce codice XML. È pertanto possibile applicare al risultato XML restituito dalle query FOR XML i metodi con tipo xml, ad esempio query() e value().

Nella query seguente il metodo query() del tipo di dati xml viene usato per l'esecuzione di una query sui risultati della query FOR XML . Per altre informazioni, vedere Metodo query() (tipo di dati xml).

USE AdventureWorks2022;
GO
SELECT (SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
DECLARE namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
DECLARE namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') AS PhoneNumbers
FROM Person.Person
FOR XML AUTO, TYPE).query('/Person.Person[1]');

La query interna SELECT ... FOR XML restituisce un risultato di tipo xml al quale la query esterna SELECT applica il metodo query() per il tipo xml . Si noti la direttiva TYPE specificata.

Risultato:

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez">
  <PhoneNumbers>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">111-111-1111</act:number>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">112-111-1111</act:number>
  </PhoneNumbers>
</Person.Person>

Nella query seguente il metodo value() con il tipo di dati xml viene usato per recuperare un valore dal risultato XML restituito dalla query SELECT...FOR XML . Per altre informazioni, vedere Metodo value() (tipo di dati xml).

USE AdventureWorks2022;
GO
DECLARE @FirstPhoneFromAdditionalContactInfo varchar(40);
SELECT @FirstPhoneFromAdditionalContactInfo =
( SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
   //act:telephoneNumber/act:number
   ') AS PhoneNumbers
   FROM Person.Person Contact
   FOR XML AUTO, TYPE).value('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
  /Contact[@BusinessEntityID="1"][1]/PhoneNumbers[1]/act:number[1]', 'varchar(40)'
);
SELECT @FirstPhoneFromAdditionalContactInfo;

L'espressione di percorso XQuery nel metodo value() recupera il primo numero di telefono di un cliente il cui BusinessEntityID è 1.

Nota

Se la TYPE direttiva non viene specificata, il risultato della query FOR XML viene restituito come tipo nvarchar(max).

Uso dei risultati di una query FOR XML in INSERT, UPDATE e DELETE (Transact-SQL DML)

Nell'esempio seguente viene illustrato l'utilizzo delle query FOR XML nelle istruzioni DML (Data Manipulation Language). Nell'esempio la query FOR XML restituisce un'istanza di tipo xml . L'istruzione INSERT inserisce il codice XML in una tabella.

CREATE TABLE T1(intCol int, XmlCol xml);
GO
INSERT INTO T1
VALUES(1, '<Root><ProductDescription ProductModelID="1" /></Root>');
GO

CREATE TABLE T2(XmlCol xml)
GO
INSERT INTO T2(XmlCol)
SELECT (SELECT XmlCol.query('/Root')
        FROM T1
        FOR XML AUTO,TYPE);
GO