SET NOCOUNT Errore nella gestione della chiamata SQL dopo l'aggiornamento


13

Stiamo aggiornando il nostro ambiente di test con un nuovo server e una versione aggiornata di Microsoft SQL Server e abbiamo riscontrato un problema.

Sul nuovo server, il nostro vecchio codice otterrà "l'operazione non è consentita quando l'oggetto è chiuso" durante l'esecuzione di alcune procedure memorizzate. Questo messaggio non è mai apparso sul vecchio server. Quando l'abbiamo rintracciato, il problema può essere risolto aggiungendo SET NOCOUNT ON;alla procedura memorizzata.

Ho esaminato le impostazioni predefinite sul database e non ho visto impostazioni diverse (SQL Server 2008 vs SQL Server 2014) relative alle impostazioni predefinite.

Quale impostazione dovrei guardare per risolverlo a livello globale senza dover aggiungere SET NOCOUNT ONun migliaio di processi memorizzati?


2
Tutte le procedure memorizzate dovrebbero specificare il comportamento su cui fare affidamento, che è molto più sicuro rispetto al fare affidamento sulle opzioni utente. Direi persino che ogni procedura memorizzata dovrebbe sempre iniziare SET NOCOUNT ON;, sempre.
Aaron Bertrand

@AaronBertrand Sono d'accordo; l'ultimo progetto in cui mi trovavo aveva un modello su cui era stato impostato nocount, ma al momento non è un'opzione in questo progetto
UnhandledExcepSean,

Si noti che è possibile scrivere uno script per modificare tutte le procedure memorizzate e aggiungere SET NOCOUNT ON;all'inizio della procedura memorizzata (dopo BEGIN). Il numero di procedure memorizzate non dovrebbe essere un problema.
Erik Un

1
@ Erik-A - non si può essere certi che inizi una procedura memorizzata BEGIN- è carina, ma non obbligatoria.
Max Vernon,

Risposte:


16

La configurazione di SQL Server ha un'opzione chiamata, in modo appropriato user options, che può essere impostata utilizzando la sp_configureprocedura memorizzata dal sistema. Ho scritto un post sul blog su SQL Server Science che mostra come ispezionare e impostare le opzioni utente.

In breve, puoi ottenere il "valore di configurazione" dal vecchio server, usando questo:

EXEC sys.sp_configure 'user options';

Quindi, imposta il nuovo server per utilizzare le stesse opzioni tramite questo:

EXEC sys.sp_configure 'user options', <config value>;
RECONFIGURE

(sostituire il <valore di configurazione> con il valore dal vecchio server).


Questo è quasi sicuramente la causa (in attesa di conferma ora). Il vecchio server aveva un valore di 512 che è NOCOUNT secondo MS ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ). Non l'ho visto prima visto che stavo solo guardando @@ OPTIONS
UnhandledExcepSean

È assolutamente corretto. Se SET NOCOUNT ONrisolve il problema, l'impostazione delle opzioni utente su 512 lo risolverà.
Max Vernon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.