Clausola FOR (Transact-SQL)

La clausola FOR viene utilizzata per specificare l'opzione BROWSE o XML. BROWSE e XML sono opzioni non correlate.

Nota importanteImportante

La direttiva XMLDATA all'opzione FOR XML è obsoleta. Utilizzare la generazione XSD in caso di modalità RAW e AUTO. Non sono disponibili sostituzioni per la direttiva XMLDATA in modalità EXPLICIT. Questa caratteristica verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Evitare di utilizzare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

[ FOR { BROWSE | <XML> } ]
<XML> ::=
XML 
{ 
    { RAW [ ( 'ElementName' ) ] | AUTO } 
    [ 
        <CommonDirectives> 
        [ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ] 
        [ , ELEMENTS [ XSINIL | ABSENT ] 
    ]
  | EXPLICIT 
    [ 
        <CommonDirectives> 
        [ , XMLDATA ] 
    ]
  | PATH [ ( 'ElementName' ) ] 
    [
        <CommonDirectives> 
        [ , ELEMENTS [ XSINIL | ABSENT ] ]
    ]
} 

<CommonDirectives> ::= 
[ , BINARY BASE64 ]
[ , TYPE ]
[ , ROOT [ ( 'RootName' ) ] ]

Argomenti

  • 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 utilizzare <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 SQL Server e di aggiornarne i relativi dati una riga alla volta. Per accedere a una tabella SQL Server nell'applicazione in modalità browse, è necessario utilizzare una delle due opzioni seguenti:

    • L'istruzione SELECT utilizzata per accedere ai dati dalla tabella SQL Server deve terminare con le parole chiave FOR BROWSE. Quando si attiva l'opzione FOR BROWSE per utilizzare 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 utilizzate in genere dall'opzione FOR BROWSE per inviare i risultati all'applicazione.

    Quando si tenta di accedere ai dati dalle tabelle 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 SQL Server in modalità browse utilizzando 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.

  • 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 ulteriori informazioni sui dati XML e SQL Server, vedere Costruzione di codice XML tramite la clausola FOR XML.

  • 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 utilizza il valore ElementName specificato come elemento riga generato per ogni riga. Per ulteriori informazioni, vedere Utilizzo della modalità RAW e Utilizzo della modalità RAW.

  • 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 ulteriori informazioni, vedere Utilizzo della modalità AUTO.

  • 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 ulteriori informazioni, vedere Utilizzo della modalità EXPLICIT.

  • 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.

  • 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 ulteriori informazioni, vedere Generazione di 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 ulteriori informazioni, vedere Utilizzo della modalità RAW.

  • 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 ulteriori informazioni, vedere Creazione di elementi per valori NULL tramite il parametro XSINIL.

  • 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 dei 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 ulteriori informazioni, vedere Utilizzo della modalità PATH.

  • 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.

  • TYPE
    Specifica che la query restituisce i risultati con il tipo xml. Per ulteriori informazioni, vedere Direttiva TYPE in 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 facoltativo, verrà aggiunto l'elemento <root> predefinito.

Esempi

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 AdventureWorks;
GO
SELECT ContactID, FirstName, LastName, Phone
FROM Person.Contact
WHERE LastName LIKE 'G%'
ORDER BY LastName, FirstName 
FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;