0

我想在一个插入语句中插入多条记录,当时我的触发器出现错误

错误是

Msg 512, Level 16, State 1, Procedure SetIntFlag, Line 7 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. The statement has been terminated.

我的触发器是

declare @act char(16)if update (first_nm)
set @act = (select acct_no from inserted)
update Client set Phn9_int = 1 where acct_no = @act

如果不止一列插入其显示错误,因为它分配给一个变量。

4

3 回答 3

2

假设这是整个触发器:

update Client set Phn9_int = 1 where acct_no in (
    select acct_no from inserted)

基本上,我的经验法则是,如果您在触发器中看到任何标量变量,就多行操作而言,它可能已被破坏。例外是如果它使用游标,但通常可以避免使用游标。

于 2013-03-21T07:10:23.857 回答
0

不要在 WHERE 子句中使用 local_variable 作为条件。而是使用简单的 JOIN 条件

if update (first_nm)
update c
set c.Phn9_int = 1
FROM Client c JOIN inserted i ON c.acct_no = i.acct_no
于 2013-03-21T07:38:24.767 回答
0

声明光标在插入并使用它,代码应该类似于下面的:

DECLARE @act char(16)
DECLARE my_Cursor CURSOR FAST_FORWARD FOR SELECT acct_no FROM INSERTED;

OPEN my_Cursor 
FETCH NEXT FROM my_Cursor into @act

WHILE @@FETCH_STATUS = 0 
BEGIN 
     UPDATE Client SET Phn9_int = 1 where acct_no = @act
     FETCH NEXT FROM my_Cursor into @act 
END

CLOSE my_Cursor
DEALLOCATE my_Cursor
于 2013-03-21T07:10:31.830 回答