#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 он устареет:
Комментарии:
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, даже если этот выбор происходит в процедуре, которую вы вызываете. Так что будьте осторожны.