Безопасно ли использовать SET ROWCOUNT?

#sql-server #sql-server-2008 #rowcount

#sql-сервер #sql-server-2008 #количество строк

Вопрос:

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

 SET ROWCOUNT @take 

SELECT * FROM Something

SET ROWCOUNT 0
  

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

Комментарии:

1. Вы можете использовать переменную с select top. select top (@take) * from Something

2. Значение Rowcount в SQL Server 2008 устарело. Если вы пишете новый код, не используйте rowcount, а вместо этого используйте TOP.

3. Не могли бы вы предоставить ссылку, в которой окончательно указано, что set rowcount устарел? Потому что technet.microsoft.com/en-us/library/ms188774.aspx этого не сказано.

Ответ №1:

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

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

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

Комментарии:

1. Но TOP нельзя использовать в PDW.

Ответ №2:

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

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

TechNet: Устаревшие функции Database Engine

Комментарии:

1. Хотя и не полностью устаревший. По вашей ссылке написано «УСТАНОВИТЬ ROWCOUNT для инструкций INSERT, UPDATE и DELETE», поэтому SELECTS все равно должен поддерживаться.

Ответ №3:

Я использую его таким образом только ДЛЯ SELECT, поэтому он еще не устарел как поток мониторинга, мне нужно выбрать все ожидающие строки из этой одной таблицы, но как поток процесса я хочу обрабатывать только 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
  

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

Ответ №4:

Извините за Necro, просто наткнулся на это на SQLServer 2016 и подумал, что это может быть интересно: если вы используете SELECT <x> INTO tabY from tabX , это также повлияет, если вы УСТАНОВИЛИ ROWCOUNT <> 0, даже если этот выбор происходит в процедуре, которую вы вызываете. Так что будьте осторожны.