Condividi tramite


Clausola SELECT - FOR (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureEndpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft FabricDatabase SQL in Microsoft Fabric

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

  • Specificare FOR BROWSE per consentire gli aggiornamenti durante la visualizzazione dei risultati della query in un cursore in modalità sfoglia.
  • Specificare FOR XML per formattare i risultati della query come XML.
  • Specificare FOR JSON per formattare i risultati della query come JSON.

Convenzioni relative alla sintassi Transact-SQL

Syntax

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

}

PER NAVIGARE

BROWSE

Specifica che gli aggiornamenti sono consentiti durante la visualizzazione dei dati in un cursore DB-Library modalità di esplorazione. È possibile esplorare una tabella in un'applicazione se la tabella include una colonna timestamp , la tabella ha un indice univoco e l'opzione FOR BROWSE si trova alla fine delle SELECT istruzioni inviate a un'istanza di SQL Server.

Note

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

FOR BROWSE non può essere visualizzato nelle SELECT istruzioni unite dall'operatore UNION .

Note

Quando le colonne chiave di indice univoche di una tabella sono nullable e la tabella si trova sul lato interno di un outer join, la modalità di esplorazione non supporta l'indice.

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 per usare la FOR BROWSE modalità di esplorazione, vengono create tabelle temporanee.

  • È necessario eseguire l'istruzione Transact-SQL seguente per attivare la modalità di esplorazione usando l'opzione NO_BROWSETABLE :

    SET NO_BROWSETABLE ON;
    

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

Quando si tenta di accedere ai dati dalle tabelle di SQL Server in modalità di esplorazione usando una SELECT query che include un'istruzione OUTER JOIN e quando viene definito un indice univoco nella tabella presente sul lato interno di un'istruzione OUTER JOIN , la modalità di esplorazione non supporta l'indice univoco. La modalità sfoglia supporta l'indice univoco solo quando tutte le colonne chiave dell'indice univoco possono accettare NULL valori. La modalità di esplorazione non supporta l'indice univoco se le condizioni seguenti sono vere:

  • Si tenta di accedere ai dati dalle tabelle di SQL Server in modalità di esplorazione usando una SELECT query 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. SampleDB Nel database creare una tleft tabella e una tright tabella che contengano una singola colonna denominata c1. Definire un indice univoco nella colonna c1 nella tabella tleft e impostare la colonna in modo da accettare NULL valori. 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 nella tabella tleft e nella tabella tright. Assicurarsi di inserire un valore NULL nella tabella tleft. 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);
    
  4. Attivare l'opzione NO_BROWSETABLE. A tale scopo, eseguire le istruzioni Transact-SQL seguenti nella finestra di query:

    SET NO_BROWSETABLE ON;
    
  5. Accedere ai dati nella tabella tleft e nella tabella tright usando un'istruzione outer join nella query SELECT. Assicurarsi che la tabella tleft si trova sul 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 OUTER JOIN tright
             ON tleft.c1 = tright.c1
    WHERE tright.c1 <> 2;
    

    Si noti l'output seguente nel riquadro risultati:

    c1
    ---
    NULL
    NULL
    

Dopo aver eseguito la SELECT query per accedere alle tabelle in modalità di esplorazione, il set di risultati della SELECT query contiene due NULL valori per la c1 colonna nella tleft tabella a causa della definizione dell'istruzione RIGHT OUTER JOIN . Pertanto, nel set di risultati non è possibile distinguere tra i NULL valori provenienti dalla tabella e i NULL valori introdotti dall'istruzione RIGHT OUTER JOIN . È possibile ricevere risultati non corretti se la query deve ignorare i NULL valori del set di risultati.

Note

Se le colonne incluse nell'indice univoco non accettano NULL valori, tutti i NULL valori 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 delle modalità XML seguenti: RAW, AUTO, EXPLICIT. Per altre informazioni sui dati XML e su SQL Server, vedere FOR XML (SQL Server).

RAW [ ('NomeElemento') ]

Accetta il risultato della query e trasforma ogni riga nel set di risultati in un elemento XML con un identificatore generico <row /> come tag di elemento. È possibile specificare facoltativamente un nome per l'elemento riga. L'output XML risultante utilizza il ElementName specificato come elemento di 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 almeno una colonna è elencata nella clausola SELECT, è 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. Usando questa modalità, è necessario scrivere query in modo specifico in modo che specifichino in modo esplicito informazioni aggiuntive sull'annidamento desiderato. 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 XMLDATA, lo schema XDR viene aggiunto al documento.

Important

La XMLDATA direttiva è deprecata. Usare la generazione XSD per RAW le modalità e AUTO . Non esiste alcuna sostituzione per la XMLDATA direttiva in EXPLICIT modalità . 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 FOR XML clausola . 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 possono verificarsi al centro di una sottostringa che non deve essere suddivisa tra le righe. È possibile evitare interruzioni di riga usando un cast AS XMLDATA. Questa soluzione può essere applicata anche quando si usa FOR JSON PATH, come nell'istruzione SELECT di esempio seguente Transact-SQL:

SELECT CAST (
    (SELECT column1,
            column2
    FROM my_table
    FOR XML PATH ('')) AS VARCHAR (MAX)
) AS XMLDATA;

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, la query ne esegue il mapping agli attributi XML. Questa opzione è supportata solo nelle RAWmodalità , AUTOe PATH . Per altre informazioni, vedere Usare la modalità RAW con FOR XML.

XSINIL

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

ABSENT

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

PERCORSO [ ('NomeElemento') ]

Genera un wrapper di elemento <row> per ogni riga nel set di risultati. Facoltativamente, è possibile specificare un nome di elemento per il wrapper dell'elemento <row>. Se si specifica una stringa vuota, ad esempio FOR XML PATH ('')), non viene generato un elemento wrapper. L'uso di PATH potrebbe offrire un'alternativa più semplice alle query scritte usando 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. Quando si recuperano dati binari usando RAW e EXPLICIT modalità, è necessario specificare questa opzione. Questa opzione è l'impostazione predefinita in AUTO modalità .

TYPE

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

RADICE [ ('RootName') ]

Specifica che un singolo elemento di primo livello viene aggiunto al codice XML risultante. Facoltativamente, è possibile specificare il nome dell'elemento radice da generare. Se non si specifica il nome radice, viene aggiunto l'elemento predefinito <root> .

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

Example

Nell'esempio seguente la clausola FOR XML AUTO viene specificata con le opzioni TYPE e XMLSCHEMA. A causa dell'opzione TYPE , la query restituisce il set di risultati 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 AdventureWorks2025;
SELECT p.BusinessEntityID,
       FirstName,
       LastName,
       PhoneNumber AS Phone
FROM Person.Person AS p
     INNER 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

Remarks

In Fabric Data Warehouse la query deve terminare con FOR JSON, quindi non è possibile usarla all'interno di sottoquery.

JSON

Specificare FOR JSON per restituire i risultati di una query formattata come testo JSON. È anche necessario specificare una delle modalità JSON seguenti: AUTO o PATH. Per altre informazioni sulla clausola , vedere Formattare i risultati della FOR JSONquery come JSON con FOR JSON.

AUTO

Formattare automaticamente l'output JSON in base alla struttura dell'istruzione SELECT specificando FOR JSON AUTO. Per altre info ed esempi, vedi Formattare automaticamente l'output JSON con la modalità AUTO.

PATH

Ottenere il controllo completo sul formato dell'output JSON specificando FOR JSON PATH. PATH modalità consente di creare oggetti wrapper e annidare proprietà complesse. Per altre informazioni ed esempi, vedi Formattare l'output JSON annidato con la modalità PATH.

INCLUDE_NULL_VALUES

Includere NULL valori 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 info ed esempi, vedere Includere valori Null in JSON - opzione INCLUDE_NULL_VALUES.

RADICE [ ('RootName') ]

Aggiungere un singolo 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 ha un elemento radice. Per altre info ed esempi, vedere Aggiungere un nodo radice all'output JSON con l'opzione ROOT.

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 da JSON - Opzione WITHOUT_ARRAY_WRAPPER.

Per altre informazioni, vedere Formattare i risultati delle query come JSON con FOR JSON.