是否可以在使用OUTPUT插入之前自动清除表格?

时间:2018-09-13 06:13:07

标签: sql sql-server sql-server-2016

我有以下内容:

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 :(得分:2)

@@ROWCOUNT通常会告诉您最后一条语句影响了多少行,因此您可以在每个IF @@ROWCOUNT = 0之后添加一个INSERT测试,这将告诉您没有行已被该语句插入。

唯一需要警惕的是,{em>实际上每条语句都会重置@@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进行错误处理,但我仍然回到“旧的学校”的方法。