Как применить определенное количество или диапазон затронутых строк в SQL Server или ASP.NET C # - PullRequest
2 голосов
/ 17 февраля 2011

для некоторых запросов SQL я знаю ожидаемое количество строк, на которые должны влиять операторы UPDATE, DELETE или INSERT.Это может быть число, например 1, или диапазон, например, 0-1 или 1-2 и т. Д.

. Каков наилучший способ установить, что это число затронутых строк и что в противном случае создается исключение?

Кроме того, могу ли я ограничить количество строк, на которые влияет UPDATE / DELETE / INSERT, чтобы сказать 1 строку и в противном случае получить исключение?

Спасибо

Ответы [ 4 ]

5 голосов
/ 17 февраля 2011

Вы можете использовать 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  
2 голосов
/ 17 февраля 2011

Используйте @@ ROWCOUNT непосредственно после вашего заявления. Если не равно, что вы хотите, используйте RAISERROR .

Одно небольшое предупреждение, однако, RAISERROR имеет параметр серьезности. Используйте число от 11 до 19. Меньше 11 считается предупреждением. Более 19 может быть установлено только системными администраторами, это фатальная ошибка и разрывает ваше соединение.

2 голосов
/ 17 февраля 2011

Для операторов UPDATE, INSERT и DELETE ExecuteNonQuery возвращает количество строк, затронутых командой.

Я предлагаю вам заключить вызов в транзакцию и, если результат не соответствует ожидаемому, откатить транзакцию и выдать исключение.

Вы также можете использовать @@ ROWCOUNT , чтобы сделать то же самое внутри запроса.

0 голосов
/ 17 февраля 2011

Я думаю, что на уровне запросов нужно использовать либо @@ ROWCOUNT внутри процедуры, либо аналогично извне, но вам нужно использовать транзакции.

Если вы хотите немного опустить базу данных(так как вышеупомянутый метод будет защищать только запросы, предназначенные для использования такой структуры), тогда вы можете использовать триггеры для таблиц и получить счетчик псевдостолов INSERTED или DELETED и использовать RAISERRROR для вызова соответствующей ошибки.

...