Как применить определенное количество или диапазон затронутых строк в SQL Server или ASP.NET C#
Для некоторых запросов SQL я знаю ожидаемое количество строк, на которые должны влиять операторы UPDATE, DELETE или INSERT. Это может быть число, например 1, или диапазон, например, 0-1 или 1-2 и т. Д.
Каков наилучший способ убедиться, что это число затронутых строк и что в противном случае выдается исключение?
Кроме того, могу ли я ограничить число строк, на которые влияет UPDATE/DELETE/INSERT, чтобы сказать 1 строку, а в противном случае получить исключение?
Спасибо
4 ответа
Для операторов UPDATE, INSERT и DELETE ExecuteNonQuery возвращает количество строк, затронутых командой.
Я предлагаю вам заключить вызов в транзакцию и, если результат не соответствует ожидаемому, откатить транзакцию и выдать исключение.
Вы также можете использовать @@ROWCOUNT, чтобы сделать то же самое внутри запроса.
Вы можете использовать TOP при вставке, обновлении и удалении, чтобы обеспечить количество затронутых строк. Здесь нет исключений.
declare @T table (id int)
insert top(1) into @T values
(1),
(2),
(3)
Если вы хотите исключение, вы можете использовать @@ROWCOUNT
в транзакции.
declare @Min int = 2
declare @Max int = 3
begin transaction
insert into Table1 values
(1),
(2),
(3),
(4)
if not @@rowcount between @Min and @Max
begin
rollback
-- Throw exception here, RAISERROR()
end
else
begin
commit
end
Используйте @@ROWCOUNT сразу после вашего заявления. Если не равен тому, что вы хотите, используйте RAISERROR.
Одно небольшое предупреждение, однако, RAISERROR имеет параметр серьезности. Используйте число от 11 до 19. Меньше 11 считается предупреждением. Более 19 может быть сделано только системными администраторами, это фатальная ошибка и разрывает ваше соединение.
Я думаю, что на уровне запросов нужно использовать либо @@ROWCOUNT внутри процедуры, либо аналогично снаружи, но вам нужно использовать транзакции.
Если вы хотите пойти немного ниже в базе данных (поскольку вышеупомянутый метод будет защищать только запросы, предназначенные для использования такой структуры), то вы можете использовать триггеры для таблиц и получить счетчик псевдостолов INSERTED или DELETED и использовать RAISERRROR поднять соответствующую ошибку.