Opzioni SET che hanno effetto sui risultati

Quando si definiscono indici per le colonne calcolate e si utilizzano viste indicizzate, i risultati vengono archiviati nel database in modo che possano essere utilizzati in seguito. I risultati archiviati sono validi solo se tutte le connessioni che fanno riferimento alla vista indicizzata o alla colonna calcolata indicizzata possono generare lo stesso set di risultati della connessione che ha creato l'indice. Per verificare che i risultati archiviati possano essere gestiti in modo corretto e restituiscano risultati consistenti, è necessario che le opzioni SET incluse nella tabella illustrata di seguito siano impostate sui valori indicati nella colonna Valore necessario quando si verificano le condizioni seguenti:

  • Viene creato un indice in una vista o in una colonna calcolata.

  • Viene definita una colonna calcolata specificando PERSISTED.

  • Un'operazione INSERT, UPDATE o DELETE modifica i valori dei dati archiviati nella vista indicizzata o nella colonna calcolata indicizzata. Sono incluse operazioni come BCP, DTS, replica e query distribuite.

  • Query Optimizer utilizza l'indice nel piano di esecuzione delle query.

  • Per le viste indicizzate, le opzioni ANSI_NULLS e QUOTED_IDENTIFIER devono essere impostate su ON quando viene creata la vista, in quanto le due impostazioni vengono archiviate insieme ai metadati della vista.

    Opzioni SET

    Valore necessario

    Valore predefinito del server

    Valore OLE DB

    e ODBC predefinito

    Valore DB-Library

    predefinito

    ANSI_NULLS

    ON

    OFF

    ON

    OFF

    ANSI_PADDING

    ON

    ON

    ON

    OFF

    ANSI_WARNINGS*

    ON

    OFF

    ON

    OFF

    ARITHABORT

    ON

    ON

    OFF

    OFF

    CONCAT_NULL_YIELDS_NULL

    ON

    OFF

    ON

    OFF

    NUMERIC_ROUNDABORT

    OFF

    OFF

    OFF

    OFF

    QUOTED_IDENTIFIER

    ON

    OFF

    ON

    OFF

    *Quando il livello di compatibilità del database viene impostato su 90 o su un livello superiore, l'impostazione di ANSI_WARNINGS su ON comporta inoltre l'impostazione implicita di ARITHABORT su ON. Se il livello di compatibilità del database è impostato su 80 o su un valore inferiore, l'opzione ARITHABORT deve essere impostata esplicitamente su ON.

Quando le opzioni SET non sono impostate in modo corretto, possono verificarsi una o più delle situazioni seguenti:

  • Motore di database genera un errore ed esegue il rollback di qualsiasi istruzione INSERT, UPDATE o DELETE tramite cui vengono modificati i valori dei dati archiviati nell'indice.

  • Query Optimizer non considera l'indice nel piano di esecuzione di qualsiasi istruzione Transact-SQL.

  • La vista indicizzata o la colonna calcolata non può essere creata.

Impostazioni delle opzioni SET per connessioni OLE DB e ODBC

La maggior parte delle applicazioni utilizza il provider OLE DB per SQL Server o il driver ODBC SQL Server per connettersi a un'istanza di SQL Server, incluse le operazioni di SQL Server Management Studio, Integration Services, replica e copia bulk. Le impostazioni predefinite OLE DB e ODBC sono corrette per le sei opzioni SET necessarie per gli indici nelle viste o nelle colonne calcolate. Per i valori OLE DB e ODBC predefiniti, vedere la tabella predefinita. Queste impostazioni corrispondono alle regole dello standard ISO e rappresentano le impostazioni consigliate per SQL Server. Per ulteriori informazioni, vedere Configurazione di rete dei client.

[!NOTA]

Alcune utilità di SQL Server impostano su OFF una o più opzioni ANSI per motivi di compatibilità con le versioni precedenti delle utilità.

Impostazioni delle opzioni SET per connessioni DB-Library ed Embedded SQL per C

Per impostazione predefinita, le applicazioni DB-Library e Embedded SQL per C non modificano le opzioni di sessione. Nei sistemi che utilizzano queste API è necessario scrivere le applicazioni per l'esecuzione delle istruzioni SET appropriate oppure sostituire i valori predefiniti del database o del server con le impostazioni corrette.

Priorità per l'impostazione delle opzioni

L'impostazione ON o OFF per le opzioni SET può essere specificata a diversi livelli. L'impostazione finale per ogni opzione di sessione è determinata dall'operazione con la più alta priorità di esecuzione che imposta l'opzione. Di seguito viene indicata in ordine decrescente la priorità delle operazioni di impostazione della sessione:

  • Tutte le applicazioni sono in grado di modificare in modo esplicito qualsiasi impostazione predefinita eseguendo un'istruzione SET dopo avere stabilito la connessione a un server. L'istruzione SET ha la priorità su tutte le impostazioni precedenti e può essere utilizzata per impostare le opzioni su ON o su OFF in modo dinamico durante l'esecuzione dell'applicazione. Le opzioni possono essere applicate solo alla sessione di connessione corrente.

  • Nelle stringhe di connessione delle applicazioni OLE DB e ODBC possono essere specificate le impostazioni delle opzioni valide durante la connessione. Le opzioni possono essere applicate solo alla sessione di connessione corrente.

  • Le opzioni SET specificate per un'origine dati ODBC SQL Server utilizzando l'applicazione ODBC nel Pannello di controllo oppure la funzione ODBC SQLConfigDataSource.

  • Impostazioni predefinite per un database. Per specificare tali valori, è possibile utilizzare ALTER DATABASE o Esplora oggetti di SQL Server Management Studio.

  • Impostazioni predefinite per un server. Per specificare tali valori, è possibile utilizzare la stored procedure sp_configure oppure Esplora oggetti in SQL Server Management Studio per impostare l'opzione di configurazione del server denominata user options.

Il valore ODBC predefinito per ANSI_NULLS, ad esempio, è ON. È tuttavia possibile ignorare questo valore impostando l'opzione su OFF in una stringa di connessione ODBC oppure utilizzando istruzioni SET dopo avere eseguito la connessione al database.

Stored procedure e trigger

È necessario scrivere le stored procedure e i trigger affinché possano essere utilizzati con le sei opzioni SET richieste per supportare gli indici nelle viste e nelle colonne calcolate. Query Optimizer non utilizza un indice in una vista o in una colonna calcolata nelle istruzioni SELECT eseguite da una stored procedure o da un trigger se le opzioni SET non sono impostate correttamente. Un'istruzione INSERT, UPDATE o DELETE nella stored procedure o nel trigger che modifica i valori dei dati archiviati nella vista indicizzata o nella colonna calcolata genera un errore.

Considerazioni

Poiché l'istruzione SET è in grado di modificare le opzioni di sessione in modo dinamico, è necessario prestare particolare attenzione quando si eseguono istruzioni SET in un database con indici in viste e colonne calcolate indicizzate. Si supponga, ad esempio, un'applicazione che stabilisce una connessione in cui le impostazioni predefinite consentono di fare riferimento a una vista indicizzata o a una colonna calcolata indicizzata. Se la connessione chiama una stored procedure o un trigger cui è associata una prima istruzione SET ANSI_WARNINGS OFF, questa istruzione sostituisce le impostazioni predefinite precedenti oppure le impostazioni per ANSI_WARNINGS. In questo caso, Query Optimizer ignora tutte le viste indicizzate o le colonne calcolate indicizzate durante l'elaborazione di qualsiasi istruzione nella stored procedure o nel trigger.

Altre tre opzioni di sessione potrebbero avere effetto sul formato dei set di risultati: DATEFIRST, DATEFORMAT e LANGUAGE. Le funzioni i cui risultati potrebbero dipendere dalle modifiche apportate a queste opzioni sono classificate come non deterministiche e non possono essere utilizzate in viste o colonne calcolate indicizzate.