Можно ли очистить таблицу автоматически перед вставкой с использованием OUTPUT? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть следующее:

DECLARE @ids TABLE (Id int);

DECLARE @temp TABLE (Id int);

insert into @temp
output inserted.Id into @ids 
select 10;

insert into @temp
output inserted.Id into @ids 
select 20;

insert into @temp
output inserted.Id into @ids 
select 30;

insert into @temp
output inserted.Id into @ids 
select 40;

select * from @temp
select * from @ids 

В результате обе таблицы будут иметь 4 записи. Я хочу использовать переменную @temp, чтобы проверить, что запись была успешно вставлена, и, если нет, сразу после этого выдать ошибку.

Чтобы не загромождать код различными переменными, я бы хотел повторно использовать переменную @temp для каждой проверки.

Однако, с учетом вышеизложенного, записи продолжают вставляться. Есть ли способ очищать / сбрасывать переменную автоматически, не используя DELETE FROM каждый раз перед INSERT INTO?

1 Ответ

0 голосов
/ 13 сентября 2018

@@ROWCOUNT, в общем, говорит вам, сколько строк было затронуто последним оператором, поэтому вы можете добавить тест IF @@ROWCOUNT = 0 после каждого INSERT, и это скажет вам, что строк нет был вставлен этим заявлением.

Единственное, что следует опасаться, это то, что @@ROWCOUNT (например, @@ERROR 1 ) сбрасывается на практически каждое утверждение, включая такие вещи, как IF !. Поэтому, если вам нужны более сложные проверки для нескольких операторов (или вы хотите проверить оба), лучше записать их значения в локальные переменные:

DECLARE @rc int
DECLARE @err int
DECLARE @ids TABLE (Id int);

DECLARE @temp TABLE (Id int);

insert into @temp
output inserted.Id into @ids 
select 10;
SELECT @rc = @@ROWCOUNT, @err = @@ERROR
--If we check @@ROWCOUNT again here, it will be equal to 1 because of the assigning SELECT
--but @rc and @err retain the values from the INSERT

1 Конечно, современный код должен использовать TRY / CATCH для обработки ошибок, но я все еще время от времени возвращаюсь к методам "старой школы".

...