Condividi tramite


Linee guida per l'utilizzo della clausola FOR XML

È possibile utilizzare la clausola FOR XML nelle query di livello principale e nelle subquery. La clausola FOR XML di livello principale può essere utilizzata solo nell'istruzione SELECT. Nelle subquery, è possibile utilizzare FOR XML nelle istruzioni INSERT, UPDATE e DELETE. La clausola può inoltre essere utilizzata nelle istruzioni di assegnazione. Ad esempio:

DECLARE @x xml
SET @x = (SELECT *
FROM Sales.Customer
FOR XML AUTO, TYPE)
SELECT @x

Si noti che la direttiva TYPE restituisce il risultato della query come dati di tipo xml. Se questa direttiva non viene specificata, il risultato della query FOR XML sarà di tipo nvarchar(max). Il risultato viene quindi convertito in xml e assegnato alla variabile di tipo xml.

Per la clausola FOR XML sono valide le limitazioni seguenti:

  • FOR XML non è valida per qualsiasi selezione utilizzata con una clausola COMPUTE BY o FOR BROWSE. Ad esempio, il codice seguente genera un errore:

    SELECT TOP 5 SalesOrderID, UnitPrice 
    FROM Sales.SalesOrderDetail 
    ORDER BY SalesOrderID COMPUTE SUM(UnitPrice) BY SalesOrderID
    FOR XML AUTO
    
  • La clausola FOR XML di livello principale senza la direttiva TYPE non può essere utilizzata con i cursori.

  • 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.AdventureWorks.Person.Contact
    FOR XML AUTO
    

    Se ServerName è un server locale, il risultato restituito dalla query è il seguente:

    <AdventureWorks.Person.Contact LastName="Achong" />
    

    Se ServerName è un server di rete, il risultato restituito dalla query è il seguente:

    <ServerName.AdventureWorks.Person.Contact LastName="Achong" />
    

    È possibile evitare questa ambiguità specificando l'alias seguente:

    SELECT TOP 1 LastName
    FROM ServerName.AdventureWorks.Person.Contact x
    FOR XML AUTO 
    

    Di seguito è riportato il risultato della query:

    <x LastName="Achong"/>
    

Inoltre, i nomi di SQL Server che includono caratteri non validi per i nomi XML, quali gli spazi, vengono convertiti in nomi XML in modo tale che i caratteri non validi vengano convertiti in codici numerici in sequenza escape.

In un nome XML possono essere presenti solo due caratteri non alfabetici, ovvero i due punti (:) e il carattere di sottolineatura (_). Poiché il carattere di due punti è già riservato per gli spazi dei nomi, come carattere di escape viene utilizzato il carattere di sottolineatura. Di seguito vengono illustrate le regole di conversione in caratteri di escape:

  • Per i caratteri UCS-2 non validi per i nomi XML, in base alla specifica XML 1.0, vengono utilizzati i caratteri di escape _xHHHH_, dove HHHH rappresenta il codice UCS-2 esadecimale a quattro cifre per il carattere in base all'ordine del primo bit più significativo. Ad esempio, il nome della tabella Order Details viene convertito in Order_x0020_Details.

  • I caratteri che non rientrano nelle specifiche UCS-2 (le aggiunte UCS-4 dell'intervallo da U+00010000 a U+0010FFFF) vengono convertiti in _xHHHHHHHH_, dove HHHHHHHH rappresenta la codifica UCS-4 esadecimale a otto cifre del carattere, se è attiva la compatibilità con le versioni precedenti. In caso contrario, i caratteri vengono convertiti in _xHHHHHH_ per la compatibilità con lo standard SQL-2003.

  • Per il carattere di sottolineatura è necessario utilizzare caratteri di escape solo se è seguito dal carattere x. Ad esempio, il nome della tabella Order_Details non viene convertito.

  • Per il carattere dei due punti negli identificatori non vengono utilizzati caratteri di escape, in modo tale che l'elemento dello spazio dei nomi e i nomi degli attributi possano essere generati dalla query FOR XML. Ad esempio, la query seguente genera un attributo dello spazio dei nomi che include i due punti nel nome.

    SELECT 'namespace-urn' as 'xmlns:namespace', 
     1 as 'namespace:a' 
    FOR XML RAW
    

    Il risultato della query è il seguente:

    <row xmlns:namespace="namespace-urn" namespace:a="1"/>
    

    Si noti che per aggiungere spazi dei nomi XML è consigliabile utilizzare WITH XMLNAMESPACES.

  • In una query SELECT, il cast di una colonna qualsiasi a una colonna BLOB (Binary Large Object) rende tale query un'entità temporanea, ovvero i relativi nomi di tabella e colonna associati verranno persi. La query in modalità AUTO genererà pertanto un errore in quanto non sarà in grado di determinare la posizione in cui inserire questo valore nella gerarchia XML. Ad esempio:

    CREATE TABLE MyTable (Col1 int PRIMARY KEY, Col2 binary)
    INSERT INTO MyTable VALUES (1, 0x7)
    

    Questa query genera un errore a causa del cast a un tipo BLOB:

    SELECT Col1,
    CAST(Col2 as image) as Col2
    FROM MyTable
    FOR XML AUTO
    

    Per risolvere il problema, è possibile aggiungere l'opzione BINARY BASE64 alla clausola FOR XML. Se si rimuove il casting, la query genera i risultati previsti:

    SELECT Col1,
    Col2
    FROM MyTable
    FOR XML AUTO
    

    Risultato:

    <MyTable Col1="1" Col2="dbobject/MyTable[@Col1='1']/@Col2" />
    
  • In SQL Server 2000, è possibile che l'output di FOR XML includa caratteri XML non validi. Ad esempio, il valore esadecimale 7 viene utilizzato come carattere di formato ma in genere non è visualizzabile come testo nell'output. SQL Server 2005 sostituisce tali caratteri con entità quando vengono restituiti in query FOR XML che non utilizzano la direttiva TYPE.
    Nei parser conformi a XML 1.0 vengono generati errori di analisi indipendentemente dal fatto che tali caratteri vengano sostituiti o meno con entità, tuttavia la forma con entità è maggiormente conforme a XML 1.1 ed è potenzialmente conforme alle versioni future dello standard XML. Semplifica inoltre il debug perché il punto di codice del carattere non valido diventa visibile.
    Per gli utenti degli strumenti XML non è necessaria alcuna soluzione alternativa, perché il parser XML genererà in ogni caso un errore in corrispondenza dei caratteri non validi. Se si utilizzano strumenti non XML potrebbe essere necessario aggiornare la logica di programmazione in modo che sia in grado di cercare i caratteri come valori sostituiti con entità.

  • In SQL Server 2005, gli spazi vuoti seguenti vengono sostituiti da entità diverse nelle query FOR XML per mantenerne la presenza durante l'esecuzione di roundtrip:

    • Nel contenuto e negli attributi di un elemento: hex(0D) (ritorno a capo)
    • Nel contenuto di un attributo: hex(09) (tabulazione), hex(0A) (avanzamento di riga)

    Ciò può influire sull'applicazione, se è stata progettata per gestire l'output di SQL Server 2000 in cui tali caratteri sono normalizzati. Questi caratteri vengono mantenuti nell'output di SQL Server 2005 e non vengono più normalizzati da un parser.

Vedere anche

Riferimento

Costruzione di codice XML tramite la clausola FOR XML

Altre risorse

SELECT (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005