SET (Transact-SQL)
Il linguaggio di programmazione Transact-SQL offre varie istruzioni SET per la modifica della gestione delle informazioni specifiche della sessione corrente. Le istruzioni SET sono raggruppate in categorie, descritte nella tabella seguente.
Per informazioni sull'impostazione delle variabili locali mediante l'istruzione SET, vedere SET @local_variable (Transact-SQL).
Categoria |
Istruzioni |
---|---|
Istruzioni relative a data e ora |
|
Istruzioni di blocco |
|
Istruzioni varie |
|
Istruzioni per l'esecuzione di query |
|
Istruzioni per impostazioni ISO |
|
Istruzioni statistiche |
|
Istruzioni per transazioni |
Considerazioni sull'utilizzo delle istruzioni SET
Tutte le istruzioni SET vengono implementate in fase di esecuzione, ad eccezione di SET FIPS_FLAGGER, SET OFFSETS, SET PARSEONLY e SET QUOTED_IDENTIFIER, che vengono implementate in fase di analisi.
Se un'istruzione SET viene eseguita in una stored procedure o in un trigger, il valore dell'opzione SET viene ripristinato al termine della stored procedure o del trigger. Se, inoltre, un'istruzione SET viene specificata in una stringa SQL dinamica che viene eseguita mediante sp_executesql o EXECUTE, il valore dell'opzione SET viene ripristinato al termine del batch specificato nella stringa SQL dinamica.
Le stored procedure vengono eseguite con le impostazioni SET specificate in fase di esecuzione, ad eccezione di SET ANSI_NULLS e SET QUOTED_IDENTIFIER. Le stored procedure che specificano SET ANSI_NULLS o SET QUOTED_IDENTIFIER utilizzano l'impostazione specificata in fase di creazione della stored procedure. Se utilizzate all'interno di una stored procedure, le impostazioni SET vengono ignorate.
L'impostazione user options di sp_configure consente di specificare opzioni a livello di server e ha effetto su più database. Questa impostazione si comporta, inoltre, come un'istruzione SET esplicita, con la sola differenza che viene applicata al momento dell'accesso.
Le impostazioni di database impostate tramite ALTER DATABASE sono valide solo a livello di database e hanno effetto solo se impostate in modo esplicito. Le impostazioni di database prevalgono sulle impostazioni delle opzioni dell'istanza impostate tramite sp_configure.
Per qualsiasi istruzione SET con le impostazioni ON e OFF è possibile specificare un'impostazione ON o OFF per più opzioni SET.
Nota
Ciò non vale per le opzioni SET correlate alle statistiche.
SET QUOTED_IDENTIFIER, ANSI_NULLS ON , ad esempio, imposta sia QUOTED_IDENTIFIER che ANSI_NULLS su ON.
Le impostazioni delle istruzioni SET prevalgono sulle equivalenti impostazioni delle opzioni di database che vengono impostate utilizzando ALTER DATABASE. Il valore specificato in un'istruzione SET ANSI_NULLS, ad esempio, prevarrà sull'impostazione di database per ANSI_NULLS. Alcune connessioni, inoltre, vengono impostate automaticamente su ON quando un utente si connette a un database in base ai valori attivati dall'impostazione sp_configure user options precedente o ai valori validi per tutte le connessioni ODBC e OLE/DB.
Le istruzioni ALTER, CREATE e DROP DATABASE non rispettano l'impostazione di SET LOCK_TIMEOUT.
Quando un'istruzione SET globale o abbreviata, ad esempio SET ANSI_DEFAULTS, include più impostazioni, l'esecuzione dell'istruzione SET abbreviata ripristina le impostazioni precedenti per tutte le opzioni su cui ha effetto tale istruzione SET. Se una singola opzione SET su cui ha effetto un'istruzione SET abbreviata viene impostata in modo esplicito dopo l'esecuzione dell'istruzione SET abbreviata, la singola istruzione SET prevale sulle corrispondenti impostazioni dell'istruzione abbreviata.
Quando si utilizzano batch, il contesto del database è determinato dal batch definito con l'istruzione USE. Le query ad hoc e tutte le altre istruzioni che vengono eseguite all'esterno della stored procedure e che sono incluse in batch ereditano le impostazioni delle opzioni del database e della connessione definiti con l'istruzione USE.
Le richieste MARS (Multiple Active Result Set) condividono uno stato globale che contiene le impostazioni delle opzioni SET della sessione più recente. Quando viene eseguita, ogni richiesta può modificare le opzioni SET. Le modifiche sono specifiche del contesto della richiesta in cui sono impostato e non hanno alcun effetto sulle altre richieste MARS contemporanee. Al termine dell'esecuzione della richiesta, tuttavia, le nuove opzioni SET vengono copiate nello stato della sessione globale. Le nuove richieste che vengono eseguite nella stessa sessione dopo questa modifica utilizzeranno queste nuove impostazioni delle opzioni SET.
Una stored procedure eseguita da un batch o da un'altra stored procedure viene eseguita in base ai valori delle opzione impostate nel database che contiene la stored procedure. Se, ad esempio, la stored procedure db1.dbo.sp1 chiama la stored procedure db2.dbo.sp2, la stored procedure sp1 viene eseguita con l'impostazione corrente del livello di compatibilità del database db1 e la stored procedure sp2 viene eseguita con l'impostazione corrente del livello di compatibilità del database db2.
Quando un'istruzione Transact-SQL fa riferimento a oggetti che si trovano in più database, a tale istruzione si applicano il contesto del database corrente e il contesto della connessione corrente. In questo caso, se l'istruzione Transact-SQL si trova in un batch, il contesto della connessione corrente è il database definito dall'istruzione USE. Se l'istruzione Transact-SQL si trova in una stored procedure, il contesto della connessione è il database che contiene la stored procedure.
Quando si creano e modificano indici in colonne calcolate o viste indicizzate, le opzioni SET ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_PADDING e ANSI_WARNINGS devono essere impostate su ON. L'opzione NUMERIC_ROUNDABORT deve essere impostata su OFF.
Se per una di queste opzioni non vengono impostati i valori richiesti, non sarà possibile eseguire in modo corretto le azioni INSERT, UPDATE, DELETE, DBCC CHECKDB e DBCC CHECKTABLE nelle viste indicizzate o nelle tabelle con indici nelle colonne calcolate. SQL Server genererà un avviso contenente le opzioni impostate in modo errato. SQL Server elaborerà, inoltre, le istruzioni SELECT in tali tabelle o viste indicizzate come se gli indici nelle colonne calcolate o nelle viste non esistessero.