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 nel database SQL di Microsoft Fabric 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 in modalità sfoglia 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. La modalità Sfoglia supporta l'indice univoco solo quando tutte le colonne chiave dell'indice univoco possono accettare NULL
valori. 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:
In SQL Server Management Studio creare un database denominato
SampleDB
.Nel database
SampleDB
creare una tabellatleft
e una tabellatright
che contengano una singola colonna denominatac1
. Definire un indice univoco nella colonnac1
nella tabellatleft
e impostare la colonna in modo da accettareNULL
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
Inserire diversi valori nella tabella
tleft
e nella tabellatright
. Assicurarsi di inserire un valoreNULL
nella tabellatleft
. 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
Attivare l'opzione
NO_BROWSETABLE
. A tale scopo, eseguire le istruzioni Transact-SQL seguenti nella finestra di query:SET NO_BROWSETABLE ON ; GO
Accedere ai dati nella tabella
tleft
e nella tabellatright
usando un'istruzione outer join nella querySELECT
. Assicurarsi che la tabellatleft
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 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 query SELECT
per accedere alle tabelle in modalità di esplorazione, 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. Pertanto, nel set di risultati non è possibile distinguere tra i valori NULL
provenienti dalla tabella e i valori NULL
introdotti dall'istruzione right outer join. Se è necessario ignorare i valori di NULL
dal set di risultati, è possibile che vengano visualizzati risultati non corretti.
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 delle modalità XML seguenti: RAW
, AUTO
, EXPLICIT
. Per altre informazioni sui dati XML e su SQL Server, vedere FOR XML (SQL Server).
RAW [ ('ElementName') ]
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. 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 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 esiste alcuna sostituzione per la 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 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, vengono mappate ad attributi XML. Questa opzione è supportata solo nelle modalità RAW
, AUTO
e PATH
. Per altre informazioni, vedere Usare la modalità RAW con FOR XML.
XSINIL
Specifica che un elemento con attributo xsi:nil
impostato su True essere creato per i valori di colonna NULL
. Questa opzione può essere specificata solo con ELEMENTS
direttiva. Per altre informazioni, vedi:
ABSENT
Indica che per NULL
valori di colonna, gli elementi XML corrispondenti non verranno aggiunti nel risultato XML. Specificare questa opzione solo con ELEMENTS.
PATH [ ('ElementName') ]
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 viene specificata 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 la modalità di EXPLICIT
, è necessario specificare questa opzione. Questa è l'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 il nome radice facoltativo non viene specificato, viene aggiunto l'elemento <root>
predefinito.
Per altre informazioni, vedere FOR XML (SQL Server).
Esempio
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
Osservazioni
In Fabric Data Warehouse FOR JSON
deve essere l'ultimo operatore nella query e pertanto non è consentito all'interno di sottoquery.
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 Format query results as JSON with FOR JSON (SQL Server).
AUTO
Formattare automaticamente l'output JSON 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
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, vedere Formattare l'output JSON annidato con la modalità PATH (SQL Server).
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 proprietà JSON per i valori NULL
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 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 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).