Как узнать число затронутых строк инструкцией SQL? Функция @@ROWCOUNT

Иногда у программиста, который разрабатывает SQL инструкцию или какую-нибудь процедуру, возникает необходимость узнать количество строк, например, которые он обновил инструкцией UPDATE или удалил с помощью инструкции DELETE, Microsoft SQL Server позволяет это сделать с помощью системной функции @@ROWCOUNT. Сегодня мы поговорим об этой функции, а также рассмотрим несколько примеров ее использования.

Функция @@ROWCOUNT в T-SQL

Функция @@ROWCOUNT в языке T-SQL

@@ROWCOUNT – это системная функция в Microsoft SQL Server, которая возвращает количество затронутых строк при выполнении последней инструкции.

Возвращает значение с типом данных INT. В случае если Вы подразумеваете, что число измененных строк будет больше 2 миллиардов, то лучше использовать аналогичную функцию ROWCOUNT_BIG(), в этом случае тип возвращающего значения будет BIGINT.

Важные моменты при использовании @@ROWCOUNT:

  • Функцию ROWCOUNT необходимо использовать сразу же после выполнения той инструкции, результат которой, в части количества затронутых (измененных) строк, Вы хотите узнать. В случае если этот результат, т.е. число задействованных строк, Вам необходимо использовать дальше по коду, то это число нужно сразу сохранить в переменную;
  • Если ROWCOUNT использовать после инструкции SELECT, то функция будет возвращать число строк, которые возвращает инструкция SELECT;
  • После инструкций INSERT, UPDATE или DELETE функция ROWCOUNT будет возвращать количество задействованных строк в результате соответствующих изменений. Но при этом стоит понимать, что ROWCOUNT будет учитывать и те строки, в которых по факту изменений не произошло, но они были затронуты, например, Вы обновили поле со значением 1 на такое же значение, т.е. на 1;
  • Если @@ROWCOUNT вызвать после инструкции MERGE, то будет возвращаться общее число вставленных, обновленных и удаленных строк;
  • После выполнения инструкций присваивания функция ROWCOUNT будет возвращать значение 1, например, это относится к таким операциям как SET @TestVariable = 1 или SELECT @TestVariable = 1. Также будет возвращаться значение 1 после инструкций DECLARE CURSOR и FETCH;
  • В случаях, если ROWCOUNT используется после инструкций, которые не возвращают, не изменяют и не присваивают не одной строки, функция возвращает значение 0. К таким инструкциям можно отнести USE, IF, DEALLOCATE CURSOR, CLOSE CURSOR, BEGIN TRANSACTION или COMMIT TRANSACTION.

Примечание! Перед тем как начать, начинающим хотелось бы порекомендовать несколько полезных материалов, которые помогут Вам в освоении языка T-SQL и в понимании всего того, что будет происходить ниже:

Создаем тестовые данные для примеров

Для того чтобы посмотреть, как работает функция @@ROWCOUNT, давайте создадим таблицу. К этой таблице мы и будем обращаться в наших тестовых запросах.

Примечание! Все примеры мы будем рассматривать в СУБД Microsoft SQL Server 2016 Express.

   
   --Инструкция создания таблицы
   CREATE TABLE dbo.TestTable(
         ProductId INT IDENTITY(1,1) NOT NULL,
         ProductName VARCHAR(100) NOT NULL,
         Price MONEY
   ) 
   GO

Примеры использования функции ROWCOUNT

Теперь можно переходить к рассмотрению примеров. Так как в нашей тестовой таблице еще нет данных, давайте добавим в нее строки и посмотрим, что нам вернет @@ROWCOUNT.

Пример 1. Использование ROWCOUNT после инструкции INSERT

Для примера давайте добавим 5 строк, а после сразу вызовем функцию @@ROWCOUNT.

   
   --Инструкция добавления данных
   INSERT INTO dbo.TestTable (ProductName, Price)
           VALUES ('Системный блок', 500),
                   ('Монитор', 350),
                   ('Клавиатура', 100),
                   ('Мышь', 50),
                   ('Принтер', 400)

   --Вызов функции ROWCOUNT
   SELECT @@ROWCOUNT AS [Добавлено строк]               

   --SQL запрос на выборку, 
   --чтобы просто посмотреть фактический результат добавления строк
   SELECT * FROM dbo.TestTable

Скриншот 1

Как видим, функция вернула нам правильное значение.

Пример 2. Использование ROWCOUNT после инструкции UPDATE

Теперь давайте обновим наши данные инструкцией UPDATE и посмотрим, что нам вернет функция ROWCOUNT. Для примера мы будем обновлять поле Price, но только те строки, у которых значение данного поля больше 200. Также в предыдущем примере мы сразу смотрели на результат того, что нам вернет ROWCOUNT, но иногда требуется сохранить это значение, поэтому давайте в этом примере сохраним число, которое нам вернет ROWCOUNT в переменную.

   
   --Объявление переменной
   DECLARE @CntUpdateRow INT

   --Инструкция обновления данных
   UPDATE dbo.TestTable SET Price = Price + 10
   WHERE Price > 200

   --Вызов функции ROWCOUNT и сохранение значения в переменной
   SET @CntUpdateRow = @@ROWCOUNT 

   --SQL запрос на выборку, 
   --чтобы просто посмотреть фактический результат обновления строк
   SELECT * FROM dbo.TestTable

   --Смотрим что за число у нас сохранено в переменной
   SELECT @CntUpdateRow AS [Затронуто строк]

Скриншот 2

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

Пример 3. Использование ROWCOUNT после инструкции SELECT и операций присваивания

Сейчас давайте посмотрим, как работает функция в случаях с выборкой данных, а также после операций присваивания.

   
   --Объявление переменной
   DECLARE @TestVar INT

   --Инструкция присваивания
   SET @TestVar = 100

   --Вызов функции ROWCOUNT
   SELECT @@ROWCOUNT AS [Результат присваивания]

   --SQL запрос на выборку
   SELECT * FROM dbo.TestTable
   WHERE Price < 500

   --Вызов функции ROWCOUNT
   SELECT @@ROWCOUNT AS [Выбрано строк]

Скриншот 3

Пример 4. Использование ROWCOUNT после инструкции DELETE

В данном примере мы удалим строки из таблицы и в сообщении выведем число удаленных строк.

   
   --Объявление переменной
   DECLARE @CntDeleteRow INT

   --Инструкция удаления всех строк в таблице
   DELETE dbo.TestTable

   --Вызов функции ROWCOUNT и сохранение значения в переменной
   SET @CntDeleteRow = @@ROWCOUNT

   --Пример того, как можно обрабатывать полученный результат
   IF @CntDeleteRow > 0
        SELECT 'Было удалено строк: ' + CAST(@CntDeleteRow AS VARCHAR(10)) AS [Результат]
   ELSE
        SELECT 'Ни одной строки не удалено.' AS [Результат]

Скриншот 4

Если мы запустим этот SQL запрос второй раз, то у нас уже результат будет другим, так как ни одной строки, в этом случае, мы не удалим.

У меня все, надеюсь, материал был Вам полезен, удачи!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.