Встановити NOCOUNT Помилка обробки SQL-дзвінка після оновлення


13

Ми оновлюємо тестове середовище новим сервером та оновленою версією Microsoft SQL Server, і виникли проблеми.

На новому сервері наш старий код отримає "операція заборонена, коли об'єкт закритий" під час виконання деяких збережених процедур. Це повідомлення ніколи не з’являлося на старому сервері. Коли ми відстежили її, проблему можна вирішити, додавши SET NOCOUNT ON;до збереженої процедури.

Я переглянув значення за замовчуванням у базі даних і не побачив налаштувань, які відрізнялися б від SQL Server 2008 проти SQL Server 2014).

Яку настройку я повинен шукати, щоб вирішити це глобально, не потрібно додавати SET NOCOUNT ONдо тисячі збережених програм?


2
Усі збережені процедури повинні визначати поведінку, на яку ви покладаєтесь, що набагато безпечніше, ніж покладатися на користувацькі параметри. Я б навіть потенційно стверджував, що кожна збережена процедура повинна починатися SET NOCOUNT ON;завжди, завжди.
Аарон Бертран

@AaronBertrand Я згоден; в останньому проекті, на якому я був, був шаблон, на який не було встановлено рахунок, але наразі це не варіант для цього проекту
UnhandledExcepSean

Зауважте, що ви можете написати скрипт, щоб змінити всі збережені процедури та додати його SET NOCOUNT ON;на початку збереженої процедури (після BEGIN). Кількість збережених процедур насправді не повинна бути проблемою.
Ерік A

1
@ Erik-A - ви не можете бути впевнені, що зберігається процедура починається BEGIN- це приємно, але не потрібно.
Макс Вернон

Відповіді:


16

Конфігурація SQL Server має відповідний параметр user options, який можна встановити за допомогою sp_configureзбереженої в системі процедури. Я написав допис у блозі на SQL Server Science, в якому показав, як перевірити та встановити параметри користувача.

Якщо коротко, ви можете отримати "значення конфігурації" зі старого сервера, використовуючи це:

EXEC sys.sp_configure 'user options';

Потім встановіть новий сервер використовувати ті самі параметри через це:

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

(замініть <config value> на значення зі старого сервера).


Це майже напевно причина (чекаю на підтвердження зараз). Старий сервер мав значення 512, що становить NOCOUNT відповідно до MS ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ). Я не бачив цього раніше, оскільки дивився лише на @@ OPTIONS
UnhandledExcepSean

Це, безумовно, правильно. Якщо SET NOCOUNT ONвирішити проблему, встановлення параметрів користувача на 512 виправить це.
Макс Вернон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.