sql-server - 用于批量插入的触发触发器

标签 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

这是为表(O_SALESMAN)编写的触发器,用于从中获取几列并将其插入另一个表(O_SALESMAN_USER)。目前,批量数据通过存储过程插入到 O_SALESMAN 表中,其中触发器仅被触发一次,并且 O_SALESMAN_USER 每次存储时仅插入一条记录程序正在执行,我希望触发器在插入 O_SALESMAN 的每条记录之后运行,以便两个表应该具有相同的计数,但这种情况不会发生。所以请让我知道可以修改哪些内容在这个Trigger中实现同样的......

最佳答案

您可以按如下方式使用光标:

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

关于sql-server - 用于批量插入的触发触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2742745/

相关文章:

SQL 删除自动命名约束

java - 使用 Hibernate 查询 SQL Server 2005 加密列的 Web 应用程序

sql-server - 如何在 SQL Server 2005 中连接单引号中的字符串?

c# - 此 RPC 请求中提供的参数过多。最大值为 2100。

sql-server - nopCommerce:数据库不存在或您无权连接到该数据库

sql - 删除重复记录 SQL Server

sql-server - 监视 SQL Server 2005 的帐户事件

sql - 存储过程中的多重错误处理

sql - 递归查询 - 仅选择叶节点代表事件数据的节点

sql - 从 SQL Server 表中的 varchar 列获取子字符串