Sql 插入表中有多行

Sql 插入表中有多行,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,在MS SQL Server中的表上,如果新行满足某些条件,我需要在新行上运行CLR存储过程。我认为这或多或少是直截了当的: if ((SELECT Cabinet FROM INSERTED) = 1 OR (SELECT Cabinet FROM INSERTED) = 3) AND (SELECT Result_02 FROM INSERTED) = 'N' BEGIN DECLARE @id int SET @id = (SELECT ID FROM INSERTED)

在MS SQL Server中的表上,如果新行满足某些条件,我需要在新行上运行CLR存储过程。我认为这或多或少是直截了当的:

if ((SELECT Cabinet FROM INSERTED) = 1 OR (SELECT Cabinet FROM INSERTED) = 3) AND (SELECT Result_02 FROM INSERTED) = 'N'
BEGIN
    DECLARE @id int
    SET @id = (SELECT ID FROM INSERTED)
    exec PrintLabel
        @id,
        N'LP 2844 LGE'
END;
但是,这最近开始抛出关于返回多行的子查询的错误。我了解到,INSERT触发器对每个语句运行一次,而不一定对单个行运行。因此,IF语句可以在多行上工作,从而导致错误


我的问题是:如果在批处理中添加行(在本例中是通过MERGE语句),如何迭代每一新行

为N行调用存储过程仍然需要游标

declare @id int
declare cur cursor fast_forward for 
    select  id 
    from    inserted 
    where   Cabinet in (1,3)
open cur
fetch next from cur into @id
while @@fetch_status = 0   
    begin
    exec PrintLabel @id, N'LP 2844 LGE'
    fetch next from cur into @id
    end
close cur
deallocate cur

虽然这会起作用,但重写proc以处理多行输入要好得多。如果有一百万条记录被更改了,这会让你的桌子被占用很长时间。另一种方法是将插入的记录复制到处理表,并有一个每五分钟运行一次的作业,该作业遍历记录,然后将其从处理表中删除。这至少会将光标从触发器中移除。