Clausola SELECT - FOR (Transact-SQL)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

Usare la clausola FOR per specificare una delle opzioni seguenti per i risultati della query.

  • Consentire gli aggiornamenti durante la visualizzazione dei risultati della query in un cursore di modalità browse specificando FOR BROWSE.

  • Formattare i risultati della query come XML specificando FOR XML.

  • Formattare i risultati della query come JSON specificando FOR JSON.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

[ FOR { BROWSE | <XML> | <JSON>} ]  
  
<XML> ::=  
XML   
{   
    { RAW [ ( 'ElementName' ) ] | AUTO }   
    [   
        <CommonDirectivesForXML>   
        [ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ]   
        [ , ELEMENTS [ XSINIL | ABSENT ]   
    ]  
  | EXPLICIT   
    [   
        <CommonDirectivesForXML>   
        [ , XMLDATA ]   
    ]  
  | PATH [ ( 'ElementName' ) ]   
    [  
        <CommonDirectivesForXML>   
        [ , ELEMENTS [ XSINIL | ABSENT ] ]  
    ]  
}   
  
<CommonDirectivesForXML> ::=   
[ , BINARY BASE64 ]  
[ , TYPE ]  
[ , ROOT [ ( 'RootName' ) ] ]  
  
<JSON> ::=  
JSON   
{   
    { AUTO | PATH }   
    [   
        [ , ROOT [ ( 'RootName' ) ] ]  
        [ , INCLUDE_NULL_VALUES ]  
        [ , WITHOUT_ARRAY_WRAPPER ]  
    ]  
  
}

FOR BROWSE

BROWSE
Specifica che è possibile eseguire aggiornamenti durante la visualizzazione dei dati in un cursore DB-Library in modalità browse. In un'applicazione è possibile visualizzare una tabella in modalità browse se tale tabella include una colonna di tipo timestamp, include un indice univoco e l'opzione FOR BROWSE si trova alla fine delle istruzioni SELECT inviate a un'istanza di SQL Server.

Nota

Non è possibile usare <lock_hint> HOLDLOCK in un'istruzione SELECT che include l'opzione FOR BROWSE.

L'opzione FOR BROWSE non è supportata in istruzioni SELECT unite con l'operatore UNION.

Nota

Quando le colonne chiave indice univoco di una tabella ammettono valori Null e la tabella si trova sul lato interno di un outer join, l'indice non è supportato dalla modalità browse.

La modalità browse consente di analizzare le righe nella tabella di SQL Server e di aggiornarne i relativi dati una riga alla volta. Per accedere a una tabella di SQL Server nell'applicazione in modalità browse, è necessario usare una delle due opzioni seguenti:

  • L'istruzione SELECT usata per accedere ai dati dalla tabella di SQL Server deve terminare con le parole chiave FOR BROWSE. Quando si attiva l'opzione FOR BROWSE per usare la modalità browse, vengono create alcune tabelle temporanee.

  • Per attivare la modalità browse mediante l'opzione NO_BROWSETABLE, è necessario eseguire l'istruzione Transact-SQL seguente:

    SET NO_BROWSETABLE ON  
    

    Quando si attiva l'opzione NO_BROWSETABLE, tutte le istruzioni SELECT si comportano come se l'opzione FOR BROWSE venisse aggiunta alle istruzioni. Tuttavia, l'opzione NO_BROWSETABLE non crea le tabelle temporanee usate in genere dall'opzione FOR BROWSE per inviare i risultati all'applicazione.

Quando si tenta di accedere ai dati dalle tabelle di SQL Server in modalità browse mediante una query SELECT che include un'istruzione outer join e quando un indice univoco viene definito nella tabella presente sul lato interno di un'istruzione outer join, la modalità browse non supporta l'indice univoco. L'indice univoco viene supportato solo quando tutte le colonne chiave possono accettare valori null. Non viene supportato, invece, in presenza delle condizioni seguenti:

  • Si tenta di accedere ai dati dalle tabelle di SQL Server in modalità browse usando una query SELECT che include un'istruzione outer join.

  • Un indice univoco viene definito nella tabella presente sul lato interno di un'istruzione outer join.

Per riprodurre questo comportamento in modalità browse, effettuare le operazioni seguenti:

  1. In SQL Server Management Studio creare un database denominato SampleDB.

  2. Nel database SampleDB, creare una tabella tleft e una tabella tright, contenenti entrambe una sola colonna denominata c1. Definire un indice univoco sulla colonna c1 nella tabella tleft e impostare la colonna affinché accetti valori null. A tale scopo, eseguire le istruzioni Transact-SQL seguenti in una finestra di query appropriata:

    CREATE TABLE tleft(c1 INT NULL UNIQUE) ;  
    GO   
    CREATE TABLE tright(c1 INT NULL) ;  
    GO  
    
  3. Inserire diversi valori nelle tabelle tleft e tright. Verificare che nella tabella tleft venga inserito un valore null. A tale scopo, eseguire le istruzioni Transact-SQL seguenti nella finestra di query:

    INSERT INTO tleft VALUES(2) ;  
    INSERT INTO tleft VALUES(NULL) ;  
    INSERT INTO tright VALUES(1) ;  
    INSERT INTO tright VALUES(3) ;  
    INSERT INTO tright VALUES(NULL) ;  
    GO  
    
  4. Attivare l'opzione NO_BROWSETABLE. A tale scopo, eseguire le istruzioni Transact-SQL seguenti nella finestra di query:

    SET NO_BROWSETABLE ON ;  
    GO  
    
  5. Accedere ai dati nelle tabelle tleft e tright utilizzando un'istruzione outer join nella query SELECT. Verificare che la tabella tleft si trovi nel lato interno dell'istruzione outer join. A tale scopo, eseguire le istruzioni Transact-SQL seguenti nella finestra di query:

    SELECT tleft.c1   
    FROM tleft   
    RIGHT JOIN tright   
    ON tleft.c1 = tright.c1   
    WHERE tright.c1 <> 2 ;
    

    Notare l'output seguente nel riquadro Risultati:

    c1

    ----

    NULL

    NULL

Dopo avere eseguito la query SELECT per accedere alle tabelle in modalità browse, il set di risultati della query SELECT contiene due valori null per la colonna c1 nella tabella tleft a causa della definizione dell'istruzione right outer join. Nel set di risultati non sarà pertanto possibile distinguere tra i valori null provenienti dalla tabella e i valori null introdotti dall'istruzione right outer join. Se è necessario ignorare i valori null dal set di risultati, è possibile che si ottengano risultati errati.

Nota

Se le colonne incluse nell'indice univoco non accettano valori null, tutti i valori null nel set di risultati sono stati introdotti dall'istruzione right outer join.

FOR XML

XML
Specifica che i risultati di una query devono essere restituiti come documento XML. È necessario specificare una della modalità XML seguenti: RAW, AUTO o EXPLICIT. Per altre informazioni sui dati XML e su SQL Server, vedere FOR XML (SQL Server).

RAW [ ('ElementName') ]
Converte ogni riga del set dei risultati della query in un elemento XML con l'identificatore generico <row /> come tag dell'elemento. È possibile specificare facoltativamente un nome per l'elemento riga. L'output XML risultante usa il valore ElementName specificato come elemento riga generato per ogni riga. Per altre informazioni, vedere Usare la modalità RAW con FOR XML.

AUTO
Restituisce i risultati della query in un semplice albero XML nidificato. Ogni tabella nella clausola FROM, per cui è specificata almeno una colonna nella clausola SELECT, viene rappresentata come elemento XML. Le colonne elencate nella clausola SELECT vengono mappate agli attributi di elemento appropriati. Per altre informazioni, vedere Usare la modalità AUTO con FOR XML.

EXPLICIT
Specifica che la forma dell'albero XML risultante viene definita in modo esplicito. Con questa modalità è tuttavia necessario che le query siano scritte in modo che le informazioni aggiuntive sulla nidificazione desiderata siano specificate in modo esplicito. Per altre informazioni, vedere Usare la modalità EXPLICIT con FOR XML.

XMLDATA
Restituisce lo schema XDR inline, ma non aggiunge l'elemento radice al risultato. Se si specifica l'opzione XMLDATA, lo schema XDR viene aggiunto al documento.

Importante

La direttiva XMLDATA è deprecata. Utilizzare la generazione XSD in caso di modalità RAW e AUTO. Non sono disponibili sostituzioni per direttiva XMLDATA in modalità EXPLICIT. Questa funzionalità verrà rimossa nelle versioni future di SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

Elimina interruzioni di riga indesiderate: è possibile usare SQL Server Management Studio (SSMS) per eseguire una query che usa la clausola FOR XML. In alcuni casi viene restituito un quantitativo elevato di XML che viene visualizzato in una cella della griglia. La stringa XML potrebbe essere più lunga rispetto allo spazio disponibile per una singola riga nella cella della griglia di SQL Server Management Studio. In questi casi SQL Server Management Studio potrebbe inserire caratteri di interruzione di riga tra i segmenti lunghi dell'intera stringa XML. Tali interruzioni di riga potrebbero apparire all'interno di una sottostringa che non deve essere suddivisa in più righe. È possibile impedire le interruzioni di riga usando un cast AS XMLDATA. Questa soluzione può essere anche applicata quando si usa FOR JSON PATH. La tecnica viene spiegata in Stack Overflow e viene illustrata nell'istruzione SELECT di esempio di Transact-SQL:

XMLSCHEMA [ ('TargetNameSpaceURI') ]
Restituisce lo schema XSD inline. Quando si utilizza questa direttiva è possibile specificare facoltativamente un URI dello spazio dei nomi di destinazione, che restituisce lo spazio dei nomi specificato nello schema. Per altre informazioni, vedere Generare uno schema XSD inline.

ELEMENTS
Specifica che le colonne devono essere restituite come sottoelementi. In caso contrario, vengono mappate ad attributi XML. Questa opzione è supportata solo con le modalità RAW, AUTO e PATH. Per altre informazioni, vedere Usare la modalità RAW con FOR XML.

XSINIL
Specifica la creazione di un elemento con attributo xsi:nil impostato su True per i valori di colonna NULL. È possibile specificare questa opzione solo con la direttiva ELEMENTS. Per altre informazioni, vedi:

ABSENT
Indica che per i valori di colonna NULL non verranno aggiunti elementi XML corrispondenti nel risultato XML. Specificare questa opzione solo con ELEMENTS.

PATH [ ('ElementName') ]
Genera un wrapper dell'elemento <row> per ogni riga nel set di risultati. È possibile specificare facoltativamente un nome di elemento per il wrapper dell'elemento <row>. Se si specifica una stringa vuota, come in FOR XML PATH ('') ), non viene generato un elemento wrapper. L'utilizzo di PATH può rappresentare un'alternativa più semplice alla scrittura di query con la direttiva EXPLICIT. Per altre informazioni, vedere Usare la modalità PATH con FOR XML.

BINARY BASE64
Specifica che la query restituisce i dati binari nel formato binario con codifica Base64. Per recuperare dati binari utilizzando la modalità RAW ed EXPLICIT, questa opzione deve essere specificata. Corrisponde all'impostazione predefinita in modalità AUTO.

TIPO
Specifica che la query restituisce i risultati con il tipo xml. Per altre informazioni, vedere Direttiva TYPE nelle query FOR XML.

ROOT [ ('RootName') ]
Specifica l'aggiunta di un singolo elemento principale al documento XML risultante. È possibile specificare facoltativamente il nome dell'elemento radice da generare. Se non si specifica il nome della radice facoltativo, viene aggiunto l'elemento <root> predefinito.

Per altre informazioni, vedere FOR XML (SQL Server).

Esempio di FOR XML

Nell'esempio seguente la clausola FOR XML AUTO viene specificata con le opzioni TYPE e XMLSCHEMA. Essendo presente l'opzione TYPE, il set dei risultati viene restituito al client come tipo xml. L'opzione XMLSCHEMA imposta l'aggiunta dello schema XSD inline nei dati XML restituiti e l'opzione ELEMENTS specifica che il risultato XML è incentrato sugli elementi.

USE AdventureWorks2022;  
GO  
SELECT p.BusinessEntityID, FirstName, LastName, PhoneNumber AS Phone  
FROM Person.Person AS p  
JOIN Person.PersonPhone AS pph ON p.BusinessEntityID  = pph.BusinessEntityID  
WHERE LastName LIKE 'G%'  
ORDER BY LastName, FirstName   
FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;  

FOR JSON

JSON
Specificare la clausola FOR JSON per restituire i risultati di una query formattati come testo JSON. È anche necessario specificare una delle modalità JSON seguenti: AUTO o PATH. Per altre informazioni sulla clausola FOR JSON, vedere Formattare i risultati delle query in formato JSON con FOR JSON (SQL Server).

AUTO
Formattare l'output JSON automaticamente in base alla struttura dell'istruzione SELECT
specificando FOR JSON AUTO. Per altre informazioni ed esempi, vedere Formattare automaticamente l'output JSON con la modalità AUTO (SQL Server).

PATH
Per mantenere il controllo completo sul formato dell'output JSON specificare
FOR JSON PATH. La modalitàPATH consente di creare oggetti wrapper e annidare proprietà complesse. Per altre informazioni ed esempi, vedere Formattare l'output JSON annidato con la modalità PATH (SQL Server).

INCLUDE_NULL_VALUES
Includere valori Null nell'output JSON specificando l'opzione INCLUDE_NULL_VALUES con la clausola FOR JSON. Se non si specifica questa opzione, l'output non include le proprietà JSON per i valori Null presenti nei risultati della query. Per altre informazioni ed esempi, vedere Includere valori Null nell'output JSON con l'opzione INCLUDE_NULL_VALUES (SQL Server).

ROOT [ ('RootName') ]
Aggiungere un unico elemento di primo livello all'output JSON specificando l'opzione ROOT con la clausola FOR JSON. Se non si specifica l'opzione ROOT , l'output JSON non avrà alcun elemento radice. Per altre informazioni ed esempi, vedere Aggiungere un nodo radice all'output JSON con l'opzione ROOT (SQL Server).

WITHOUT_ARRAY_WRAPPER
Rimuovere le parentesi quadre che racchiudono l'output JSON per impostazione predefinita specificando l'opzione WITHOUT_ARRAY_WRAPPER con la clausola FOR JSON. Se non si specifica questa opzione, l'output JSON è racchiuso tra parentesi quadre. Usare l'opzione WITHOUT_ARRAY_WRAPPER per generare un singolo oggetto JSON come output. Per altre informazioni, vedere Rimuovere le parentesi quadre dall'output JSON con l'opzione WITHOUT_ARRAY_WRAPPER (SQL Server).

Per altre informazioni, vedere Formattare i risultati delle query in formato JSON con FOR JSON (SQL Server).

Vedi anche

SELECT (Transact-SQL)