Principale utente con più risposte
SET ANSI_NULLS in StoredProcedure

Domanda
-
Buongiorno
ho un problema, mai incontrato in precedenza, che credo coinvolga le opzioni di default di un database:
SCENARIO: Istanza SQLServer 2014 SP1.In un DB presente su questa istanza ho una stored procedure in questa forma (qui semplificata)
USE DB_orig SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[StoredProc_TEST] as insert into tabella1 select campo1,campo2,campo3 from tabella2 end
Lanciandola và in errore con questo messaggio:
Msg 1934, Level 16, State 1, Procedure [dbo].[StoredProc_TEST] ,
INSERT failed because the following SET options have incorrect settings: 'ANSI_NULLS'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.Ok, correggo il SET ANSI_NULLS con ON e la SP funziona.
Faccio un restore di questo DB (con altro nome ) sulla stessa istanza con la SP non corretta.
Mando in esecuzione la SP e gira senza problemi, pur essendo settato ANSI_NULLS OFF all'interno del codice.
La definizione è confermata anche interrogando sys.sql_modules sul DB originale dove compare uses_ansi_nulls=1, sul DB restorato uses_ansi_nulls=0
da sys.databases vedo per i due DB:
name is_ansi_null_default_on is_ansi_nulls_on is_ansi_padding_on is_ansi_warnings_on is_arithabort_on is_concat_null_yields_null_on is_quoted_identifier_on is_local_cursor_default DB_Orig 0 0 0 0 0 0 0 0 DB_restore 0 0 0 0 0 0 0 0 Escluderei configurazioni sull'istanza in quanto è la stessa per i due db.
Quali parametri dei due DB possono influenzare l'esecuzione con segnalazione di errore della SP su DB_Orig e senza alcuna segnalazione di errore sul suo restore?
Grazie
- Modificato Fre1976 giovedì 25 febbraio 2016 11:47
Risposte
-
Ciao Sergio,
grazie innanzitutto per la tua risposta.
La SP viene lanciata dalla stessa sessione aperta in management studio, cambiando solo il contesto del DB ( trovandomi sulla stessa istanza).
Da
SELECT @@OPTIONS 6008
che corrisponde a queste opzioni settate a ON sulla sessione
ANSI_WARNINGS
ANSI_PADDING
ANSI_NULLS
ARITHABORT
QUOTED_IDENTIFIER
NOCOUNT
ANSI_NULL_DFLT_ON
CONCAT_NULL_YIELDS_NULLun dubbio:
per le impostazioni ANSI non vengono considerate solo quelle definite nel codice della stored procedure (in particolare ANSI_NULLS ) ? Cioè nell'esecuzione della SP non vengono considerate le impostazioni presenti nella sys.sql_modules indipendentemente da quanto settato sulla connessione?grazie
Fre1976
- Contrassegnato come risposta Paola PresuttoMicrosoft employee venerdì 22 aprile 2016 11:20
-
Un dubbio:
per le impostazioni ANSI non vengono considerate solo quelle definite nel codice della stored procedure (in particolare ANSI_NULLS ) ? Cioè nell'esecuzione della SP non vengono considerate le impostazioni presenti nella sys.sql_modules indipendentemente da quanto settato sulla connessione?
Ciao,
le impostazioni ANSI vengono considerate in funzione della lista di precedenze che trovi nel sezione "Precedence for Setting Options" di questo BOL SET Options That Affect Results.
Al primo posto ci sono le impostazioni specificate nella connessione, in modo esplicito con il comando SET oppure in modo implicito nella connection string.
Qui è descritto il comportamento delle opzioni nel caso di utilizzo con Trigger e Stored Procedure:
"Stored procedures and triggers should be written to work with the six SET options that are required to support the indexes on views and computed columns. The query optimizer does not use an index on a view or computed column in SELECT statements that are executed by a stored procedure or trigger when the SET options are incorrectly set. An INSERT, UPDATE, or DELETE statement in the stored procedure or trigger that modifies data values stored in the indexed view or computed column generates an error."
Ciao
Sergio Govoni
SQL Server MVP
MVP Profile | English Blog | Twitter | LinkedIn- Modificato Sergio GovoniMVP, Moderator lunedì 7 marzo 2016 13:45
- Contrassegnato come risposta Paola PresuttoMicrosoft employee venerdì 22 aprile 2016 11:19
Tutte le risposte
-
Ciao,
nella tabella in cui la SP cerca di inserire i dati è presente uno di questi oggetti?
"indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index"
Questo è quello che cita il relativo BOL:
"Indexed views and indexes on computed columns store results in the database for later reference. The stored results are valid only if all connections referring to the indexed view or indexed computed column can generate the same result set as the connection that created the index."
La connessione che utilizzi per eseguire la SP sia sul DB originale che sul DB "restorato" ha le stesse impostazioni ANSI ?
Ciao
Sergio Govoni
SQL Server MVP
MVP Profile | English Blog | Twitter | LinkedIn- Modificato Sergio GovoniMVP, Moderator domenica 6 marzo 2016 10:50
-
Ciao Sergio,
grazie innanzitutto per la tua risposta.
La SP viene lanciata dalla stessa sessione aperta in management studio, cambiando solo il contesto del DB ( trovandomi sulla stessa istanza).
Da
SELECT @@OPTIONS 6008
che corrisponde a queste opzioni settate a ON sulla sessione
ANSI_WARNINGS
ANSI_PADDING
ANSI_NULLS
ARITHABORT
QUOTED_IDENTIFIER
NOCOUNT
ANSI_NULL_DFLT_ON
CONCAT_NULL_YIELDS_NULLun dubbio:
per le impostazioni ANSI non vengono considerate solo quelle definite nel codice della stored procedure (in particolare ANSI_NULLS ) ? Cioè nell'esecuzione della SP non vengono considerate le impostazioni presenti nella sys.sql_modules indipendentemente da quanto settato sulla connessione?grazie
Fre1976
- Contrassegnato come risposta Paola PresuttoMicrosoft employee venerdì 22 aprile 2016 11:20
-
Un dubbio:
per le impostazioni ANSI non vengono considerate solo quelle definite nel codice della stored procedure (in particolare ANSI_NULLS ) ? Cioè nell'esecuzione della SP non vengono considerate le impostazioni presenti nella sys.sql_modules indipendentemente da quanto settato sulla connessione?
Ciao,
le impostazioni ANSI vengono considerate in funzione della lista di precedenze che trovi nel sezione "Precedence for Setting Options" di questo BOL SET Options That Affect Results.
Al primo posto ci sono le impostazioni specificate nella connessione, in modo esplicito con il comando SET oppure in modo implicito nella connection string.
Qui è descritto il comportamento delle opzioni nel caso di utilizzo con Trigger e Stored Procedure:
"Stored procedures and triggers should be written to work with the six SET options that are required to support the indexes on views and computed columns. The query optimizer does not use an index on a view or computed column in SELECT statements that are executed by a stored procedure or trigger when the SET options are incorrectly set. An INSERT, UPDATE, or DELETE statement in the stored procedure or trigger that modifies data values stored in the indexed view or computed column generates an error."
Ciao
Sergio Govoni
SQL Server MVP
MVP Profile | English Blog | Twitter | LinkedIn- Modificato Sergio GovoniMVP, Moderator lunedì 7 marzo 2016 13:45
- Contrassegnato come risposta Paola PresuttoMicrosoft employee venerdì 22 aprile 2016 11:19