Безопасно ли использовать SET ROWCOUNT? - PullRequest
6 голосов
/ 03 июня 2011

Я использую SET ROWCOUNT, потому что значение входит в параметр моей процедуры.

SET ROWCOUNT @take 

SELECT * FROM Something

SET ROWCOUNT 0

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

Ответы [ 4 ]

8 голосов
/ 03 июня 2011

Количество строк зависит от вашей текущей области, поэтому вы в безопасности. Тем не менее, Books Online сообщает мне об этом (что может или не может повлиять на ваши потребности):

Использование SET ROWCOUNT не повлияет Операторы DELETE, INSERT и UPDATE в следующем выпуске SQL Server. Делать не использовать SET ROWCOUNT с DELETE, INSERT и UPDATE операторы в новом разработки, и планируем изменить приложения, которые в настоящее время используют его. Кроме того, для удаления, вставки и обновления заявления, которые в настоящее время используют SET ROWCOUNT, мы рекомендуем вам перепишите их, чтобы использовать синтаксис TOP. Для получения дополнительной информации см. УДАЛИТЬ (Transact-SQL), INSERT (Transact-SQL), или ОБНОВЛЕНИЕ (Transact-SQL).

В TOP также можно использовать переменные, и теперь они могут использоваться в инструкциях INSERT, UPDATE и DELETE. (Привет, сегодня я узнал что-то новое.) Посмотрите, как использовать TOP с переменными в Книгах онлайн.

6 голосов
/ 26 марта 2014

Я добавляю этот ответ для людей, которые все еще могут его искать.

Использование SET ROWCOUNT более не безопасно, так как оно будет устаревшим в следующей версии SQL Server:

TechNet. Устаревшие функции компонента Database Engine

0 голосов
/ 14 июня 2019

Извините за Necro, только что наткнулся на это на SQLServer 2016 и подумал, что это может быть интересно: Если вы используете SELECT <x> INTO tabY from tabX, это также будет затронуто, если у вас есть SET ROWCOUNT <> 0, даже если этот выбор происходит в вызываемой вами процедуре. Так что будь осторожен.

0 голосов
/ 06 января 2015

Я использую его вот так ТОЛЬКО ДЛЯ ВЫБОРА, ПОЭТОМУ ЕГО НЕ УСТАРЕТЬ как поток монитора мне нужно выбрать все ожидающие строки из этой таблицы, но, как поток процесса, я хочу обрабатывать только 10 строк одновременно но я не хочу, чтобы спагетти-код был в моем sproc, поэтому вот мое решение:

параметры (@top int = 0)

IF @TOP > 0
    SET ROWCOUNT @TOP -- only put a cap on the select if we pass in the @top value

- выберите как обычно выберите * из таблицы - либо получает все строки, либо получает виртуальный «top (@top)» - пример: exec up_myProc @ top = 10 - получает топ 10 - exec up_myProc @ top = 0 - получает все строки

...