Каковы последствия полного обновления хранимых процедур для включения SET NOCOUNT ON

Мы представили новую структуру доступа к данным для вызова хранимых процедур SQL. При вызове хранимой процедуры, которая возвращает набор записей, мы столкнулись с проблемами, когда эта хранимая процедура также выполняет какое-либо обновление (вставка / обновление / удаление):

Невозможно изменить свойство ActiveConnection объекта Recordset, источником которого является объект Command.

Чтобы решить эту проблему, добавьте 'SET NOCOUNT ON 'в начало хранимой процедуры. Это работает отлично, и, конечно же, имеет рекламируемое повышение производительности.

Мы рекомендуем разработчикам, когда они хотят написать код для вызова существующей хранимой процедуры, они также должны рефакторинг самой хранимой процедуры, чтобы включить SET NOCOUNT ON.

Но это заставило меня задуматься, каковы будут потенциальные последствия / риски выполнения сплошного обновления всех хранимых процедур для включения SET NOCOUNT ON. При каких сценариях это нарушит функциональность SP? (учитывая, что функция @@ ROWCOUNT обновляется, даже если SET NOCOUNT включен)

Помощь, как всегда, очень ценится.


person James Wiseman    schedule 01.03.2011    source источник
comment
Из какой структуры это сообщение об ошибке? Выглядит знакомо.   -  person Adam Houldsworth    schedule 01.03.2011
comment
Платформа настраивается, но использует ADO вместо ODBC. Вы получаете сообщение об ошибке, когда используете ExecuteQuery для описанных хранимых процедур. Принятая практика - иметь SP, который не выполняет U / I / D и не возвращает набор записей, но здесь я задерживаюсь с устаревшим кодом.   -  person James Wiseman    schedule 01.03.2011
comment
Обсуждается здесь stackoverflow.com/questions/1483732/set-nocount-on-usage   -  person Martin Smith    schedule 01.03.2011


Ответы (1)


Я думаю, что основная опасность будет заключаться в том, что какой-либо из ваших существующих процессов будет искать и / или предполагать, что количество строк будет возвращено без явного запроса значения @@ROWCOUNT.

Возможно, где-то в вашем коде есть хранимая процедура, которая запускается, и приложение ожидает, пока возвращаемое значение строки будет знать, что она завершена, и в этом случае приложение зависнет на неопределенный срок.

person JNK    schedule 01.03.2011