SET NOCOUNT Ошибка при обработке вызова SQL после обновления

13

Мы обновляем нашу тестовую среду новым сервером и обновленной версией Microsoft SQL Server и столкнулись с проблемой.

На новом сервере наш старый код получит «операция запрещена, когда объект закрыт» при выполнении некоторых хранимых процедур. Это сообщение никогда не появлялось на старом сервере. Когда мы отследили его, проблему можно решить, добавив SET NOCOUNT ON;к хранимой процедуре.

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

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

UnhandledExcepSean
источник
2
Все хранимые процедуры должны указывать поведение, на которое вы полагаетесь, что намного безопаснее, чем полагаться на пользовательские параметры. Я бы даже потенциально утверждал, что каждая хранимая процедура должна всегда начинаться SET NOCOUNT ON;всегда.
Аарон Бертран
@AaronBertrand Я согласен; последний проект, в котором я участвовал, имел шаблон, для которого был установлен nocount, но в данный момент это не вариант в этом проекте
UnhandledExcepSean
Обратите внимание, что вы можете написать сценарий для изменения всех хранимых процедур и добавления SET NOCOUNT ON;в начале хранимой процедуры (после BEGIN). Количество хранимых процедур не должно быть проблемой.
Эрик
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, которое, согласно MS, равно NOCOUNT ( docs.microsoft.com/en-us/sql/database-engine/configure-windows/… ). Я не видел этого раньше, так как смотрел только на @@ OPTIONS
UnhandledExcepSean
Это точно правильно. Если это SET NOCOUNT ONрешит проблему, установив пользовательские опции на 512, это исправит.
Макс Вернон,