SET NOCOUNT Błąd w obsłudze połączenia SQL po aktualizacji

13

Aktualizujemy nasze środowisko testowe o nowy serwer i zaktualizowaną wersję Microsoft SQL Server i napotkaliśmy problem.

Na nowym serwerze nasz stary kod otrzyma „operacja nie jest dozwolona, ​​gdy obiekt jest zamknięty” podczas wykonywania niektórych procedur przechowywanych. Ta wiadomość nigdy nie pojawiła się na starym serwerze. Po wyśledzeniu go problem można rozwiązać, dodając SET NOCOUNT ON;do procedury składowanej.

Spojrzałem na wartości domyślne w bazie danych i nie zauważyłem innych ustawień (SQL Server 2008 vs. SQL Server 2014) związanych z wartościami domyślnymi.

Na jakie ustawienie powinienem patrzeć, aby rozwiązać ten problem globalnie, bez konieczności dodawania SET NOCOUNT ONdo tysiąca przechowywanych procesów?

UnhandledExcepSean
źródło
2
Wszystkie procedury składowane powinny określać zachowanie, na którym się opierasz, co jest znacznie bezpieczniejsze niż poleganie na opcjach użytkownika. Nawet potencjalnie argumentowałbym, że każda procedura składowana powinna zawsze zaczynać się SET NOCOUNT ON;, zawsze.
Aaron Bertrand
@AaronBertrand Zgadzam się; ostatni projekt, w którym pracowałem, miał szablon, który ustawił opcję nocount, ale obecnie nie jest to opcja w tym projekcie
UnhandledExcepSean
Pamiętaj, że możesz napisać skrypt, aby zmienić wszystkie procedury przechowywane i dołączyć je SET NOCOUNT ON;na początku procedury przechowywanej (po BEGIN). Liczba procedur przechowywanych nie powinna tak naprawdę stanowić problemu.
Erik A
1
@ Erik-A - nie możesz mieć pewności, że procedura przechowywana zaczyna się od BEGIN- jest fajna, ale nie wymagana.
Max Vernon

Odpowiedzi:

16

Konfiguracja programu SQL Server ma odpowiednią opcję o nazwie odpowiednio user options, którą można ustawić za pomocą sp_configuresystemowej procedury składowanej. Napisałem post na blogu na temat SQL Server Science, pokazujący, jak sprawdzać i ustawiać opcje użytkownika.

W skrócie, możesz uzyskać „wartość konfiguracji” ze starego serwera, używając tego:

EXEC sys.sp_configure 'user options';

Następnie ustaw nowy serwer tak, aby korzystał z tych samych opcji:

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

(zastąp <wartość konfiguracji> wartością ze starego serwera).

Max Vernon
źródło
To prawie na pewno jest przyczyna (teraz czeka na potwierdzenie). Stary serwer miał wartość 512, która według MS jest NOCOUNT ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ). Nie widziałem tego wcześniej, ponieważ patrzyłem tylko na @@ OPCJE
UnhandledExcepSean
To zdecydowanie poprawne. Jeśli SET NOCOUNT ONproblem zostanie rozwiązany, ustawienie opcji użytkownika na 512 rozwiąże problem.
Max Vernon