Иногда у программиста, который разрабатывает SQL инструкцию или какую-нибудь процедуру, возникает необходимость узнать количество строк, например, которые он обновил инструкцией UPDATE или удалил с помощью инструкции DELETE, Microsoft SQL Server позволяет это сделать с помощью системной функции @@ROWCOUNT. Сегодня мы поговорим об этой функции, а также рассмотрим несколько примеров ее использования.
- Функция @@ROWCOUNT в языке T-SQL
- Создаем тестовые данные для примеров
- Примеры использования функции ROWCOUNT
- Пример 1. Использование ROWCOUNT после инструкции INSERT
- Пример 2. Использование ROWCOUNT после инструкции UPDATE
- Пример 3. Использование ROWCOUNT после инструкции SELECT и операций присваивания
- Пример 4. Использование ROWCOUNT после инструкции DELETE
Функция @@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
Как видим, функция вернула нам правильное значение.
Пример 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 [Затронуто строк]
В данном случае мы можем узнать количество измененных строк именно этой инструкцией UPDATE в любой части инструкции, т.е. не только сразу после непосредственного UPDATE (за счет сохранения значения в переменной).
Заметка! Обзор Azure Data Studio. Что это за инструмент и для чего он нужен.
Пример 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 [Выбрано строк]
Пример 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 [Результат]
Если мы запустим этот SQL запрос второй раз, то у нас уже результат будет другим, так как ни одной строки, в этом случае, мы не удалим.
У меня все, надеюсь, материал был Вам полезен, удачи!