SET NOCOUNT [ON или OFF]?

paparome
Дата: 08.06.2004 10:21:39
Ситуация:

MS SQL Server 2000 (sp3a)
В настройках коннекта по умоланию настроиваю эту опцию.

Везде рекомендуют ставить ON (у меня сложилось такое ощущение)

При этом пропали сообщение типа "Запись была изменена другим пользователем" в проектах ADP

Подключаюсь к серверу через ODBC и линкую таблицы к Акс97 (mdb)
На основе таблицы делаем форму на изменение данных
При некоторых условиях в форме необходимо сохранить редактируемую запись
Например: Me.Refresh или DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
На этой строке получаю сообщение об ошибке "ODBC --update on a linket table 'TableName' faliled."
Более того, если происходят изменения на форме, и я закрываю форму, то не происходит "привычного" сохранения записи :(

Если ставить SET NOCOUNT OFF, то в Аск97 все работает нормально (запись в связанной таблице сохраняется)

Может у меня руки кривые?
Или ODBC-драйвер, действительно, использует серверные сообщения?

Прошу высказывать свои мысли по данному поводу.

Спасибо.
Latuk
Дата: 08.06.2004 10:44:39
SET NOCOUNT OFF
Сервер старается угадать, что возвратит ХП
работает быстрее но иногда угадывает неправильно.
SET NOCOUNT ON
работает медленнее но работает

ИМХО
всегда делаем SET NOCOUNT OFF
если что (например ХП возвращает разные наборы в зависимости от IF)
делаем SET NOCOUNT ON
paparome
Дата: 08.06.2004 11:07:10
ИМХО: При SET NOCOUNT OFF - работает медленнее (увеличение сетевого трафика - как минимум)

Да, и ХП в приведенном примере не используются, понятно что в ХП можно установить любое значение на время выполнения этой ХП (не вопрос) :)

Вопрос как раз в поведении клиента Акс2000(adp) и Акс97(mdb+odbc) при непосредственной привязке формы к данным :(
Victosha
Дата: 08.06.2004 11:07:50
автор
Или ODBC-драйвер, действительно, использует серверные сообщения?

ОБЯЗАТЕЛЬНО использует.
АДО тоже ОБЯЗАТЕЛЬНО использует
ИМХО client-side рекордсет никак "правильно" не заработает,
при SET NOCOUNT ON

PS
paparome, поставь BOL - любой.

пока не поставил, вот цитата (красным выделено про "попытку угадать, иногда неправильно")

SET NOCOUNT
Stops the message indicating the number of rows affected by a Transact-SQL statement from being returned as part of the results.

Syntax
SET NOCOUNT { ON | OFF }

Remarks
When SET NOCOUNT is ON, the count (indicating the number of rows affected by a Transact-SQL statement) is not returned. When SET NOCOUNT is OFF, the count is returned.

The @@ROWCOUNT function is updated even when SET NOCOUNT is ON.

SET NOCOUNT ON eliminates the sending of DONE_IN_PROC messages to the client for each statement in a stored procedure. When using the utilities provided with Microsoft® SQL Server™ to execute queries, the results prevent "nn rows affected" from being displayed at the end Transact-SQL statements such as SELECT, INSERT, UPDATE, and DELETE.

For stored procedures that contain several statements that do not return much actual data, this can provide a significant performance boost because network traffic is greatly reduced.

The setting of SET NOCOUNT is set at execute or run time and not at parse time.

Permissions
SET NOCOUNT permissions default to all users.

Examples
This example (when executed in the osql utility or SQL Query Analyzer) prevents the message (about the number of rows affected) from being displayed.

USE pubs
GO
-- Display the count message.
SELECT au_lname
FROM authors
GO
USE pubs
GO
-- SET NOCOUNT to ON and no longer display the count message.
SET NOCOUNT ON
GO
SELECT au_lname
FROM authors
GO
-- Reset SET NOCOUNT to OFF.
SET NOCOUNT OFF
GO
paparome
Дата: 08.06.2004 11:14:34
автор
вот цитата (красным выделено про "попытку угадать, иногда неправильно")

автор
The @@ROWCOUNT function is updated even when SET NOCOUNT is ON.


И где здесь написано, что он пытается угадать?

ИМХО - здесь написано, что @@ROWCOUNT заполняется при любом значение параметра NOCOUNT

Вот выдержка из книги (перевод на русский):
Независимо от установки NOCOUNT количество строк, измененных последней командой, храниться в переменной @@ROWCOUNT

PS: А BOL у меня стоит, и читать я тоже умею :)
Victosha
Дата: 08.06.2004 11:19:20
автор
читать я тоже умею

это хорошо.
я вот, к сожалению, не возьмусь похвастать...
assa
Дата: 08.06.2004 11:23:30
в сочетании с
When SET NOCOUNT is ON, the count (indicating the number of rows affected by a Transact-SQL statement) is not returned
это и значит, что "неправильно" :0)
paparome
Дата: 08.06.2004 11:50:24
assa
в сочетании с
When SET NOCOUNT is ON, the count (indicating the number of rows affected by a Transact-SQL statement) is not returned
это и значит, что "неправильно" :0)


Что-то я сегодня не могу читать между строк :(
А где здесь сказано, что не правильно?
При SET NOCOUNT = ON, количество (индикация о кол-ве измененных/добавленных/выбранных записей) не возвращается сервером (ИМХО - вольный перевод)
т.е. не возвращается надпись типа: (240 row(s) affected)
но при этом SELECT @@ROWCOUNT честно вернет, 240? или нет?
Victosha
Дата: 08.06.2004 12:01:49
автор
SELECT @@ROWCOUNT честно вернет, 240? или нет

вернет (если его никто не успеет попортить, например следующая команда в батче типа IF @@ERROR)
paparome
Дата: 08.06.2004 13:37:22
Согласен.