我有以下内容:
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
?
答案 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
进行错误处理,但我仍然回到“旧的学校”的方法。