Dee*_*epa 7 sql-server sql-server-2005
ALTER TRIGGER [dbo].[TR_O_SALESMAN_INS]
ON [dbo].[O_SALESMAN]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
DECLARE @SLSMAN_CD NVARCHAR(20)
DECLARE @SLSMAN_NAME NVARCHAR(20)
SELECT @SLSMAN_CD = SLSMAN_CD,@SLSMAN_NAME=SLSMAN_NAME
FROM INSERTED
IF NOT EXISTS(SELECT * FROM O_SALESMAN_USER WHERE SLSMAN_CD = @SLSMAN_CD)
BEGIN
INSERT INTO O_SALESMAN_USER(SLSMAN_CD, PASSWORD, USER_CD)
VALUES(@SLSMAN_CD, @SLSMAN_CD,@SLSMAN_NAME )
END
END
Run Code Online (Sandbox Code Playgroud)
这是为table(O_SALESMAN)从中获取少量列并将其插入到另一列中而触发的触发器table(O_SALESMAN_USER).目前,批量数据O_SALESMAN通过存储过程插入到表中,其中触发器仅被触发一次并且O_SALESMAN_USER每次执行存储过程时只插入一个记录,我希望触发器在每个记录之后运行插入到O_SALESMAN这样两个表应该具有相同的计数,这是没有发生..所以请让我知道在这个触发器中可以修改什么来实现相同....
小智 7
您可以使用游标,如下所示:
create trigger trg_insertstuff
on [O_SALESMAN]
after insert
as
DECLARE @SLSMAN_CD NVARCHAR(20)
DECLARE @SLSMAN_NAME NVARCHAR(20)
declare db_cursor CURSOR FOR
SELECT SLSMAN_CD, SLSMAN_NAME
from inserted
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @SLSMAN_CD , @SLSMAN_NAME
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS(SELECT * FROM O_SALESMAN_USER WHERE SLSMAN_CD = @SLSMAN_CD)
BEGIN
INSERT INTO O_SALESMAN_USER(SLSMAN_CD, PASSWORD, USER_CD)
VALUES(@SLSMAN_CD, @SLSMAN_CD,@SLSMAN_NAME )
END
FETCH NEXT FROM db_cursor INTO @SLSMAN_CD , @SLSMAN_NAME
end
CLOSE db_cursor
DEALLOCATE db_cursor
Run Code Online (Sandbox Code Playgroud)
是的,触发器每个语句触发一次,而不是每行触发一次。
所以你需要这样的东西:
SET NOCOUNT ON
INSERT INTO O_SALESMAN_USER(SLSMAN_CD, PASSWORD, USER_CD)
SELECT
i.SLSMAN_CD,i.SLSMAN_CD,i.SLSMAN_NAME
FROM
inserted i
left join
O_SALESMAN_USER u
on
i.SLSMAN_CD = u.SLSMAN_CD
where
u.SLSMAN_CD is NULL
Run Code Online (Sandbox Code Playgroud)