Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 批量插入触发_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 批量插入触发

Sql server 批量插入触发,sql-server,sql-server-2005,Sql Server,Sql Server 2005,这是为tableO_销售人员编写的触发器,用于从中提取几列并将其插入另一个tableO_销售人员用户。目前,批量数据通过存储过程被插入O_Saleser表中,因为触发器只触发一次,而O_Saleser_用户每次执行存储过程时只插入一条记录,我希望触发器在插入O_Saleser的每条记录之后运行,这样两个表都应该具有相同的计数,而这是不发生的。因此,请告诉我可以在该触发器中修改哪些内容以实现相同的……是的,触发器每语句触发一次,而不是每行触发一次 所以你需要一些类似的东西: ALTER TRIGG

这是为tableO_销售人员编写的触发器,用于从中提取几列并将其插入另一个tableO_销售人员用户。目前,批量数据通过存储过程被插入O_Saleser表中,因为触发器只触发一次,而O_Saleser_用户每次执行存储过程时只插入一条记录,我希望触发器在插入O_Saleser的每条记录之后运行,这样两个表都应该具有相同的计数,而这是不发生的。因此,请告诉我可以在该触发器中修改哪些内容以实现相同的……

是的,触发器每语句触发一次,而不是每行触发一次

所以你需要一些类似的东西:

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

我的场景是,表名:Stock,StockLog

我通过一个存储过程在StockLog表中插入了大量行,并希望所有这些行都在StockLog表中

首先,我和你们一样,在股票表的insert触发器中使用变量 但是由于使用

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
当我插入多行时,通过选择StocklId FROM inserted得到多个值,然后删除所有变量, 现在我正在这样做

DECLARE @StocklId bigint

SET @StocklId = (SELECT StocklId FROM inserted)

现在一切都好了

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

INSERT INTO StockLog(StocklId,PharmacyId,TransactionDetailId,ProductId,TotalQty,ReservedQty,AvailableQty,strUserName,strTerminalName,strVer)

SELECT StocklId, PharmacyId, TransactionDetailId, ProductId, TotalQty, 0, AvailableQty,strUserName, strTerminalName, strVer FROM inserted

也许值得您澄清一下,您是指大容量插入,其中需要包含FIRE_触发器,还是简单的多行插入。我们不建议在触发器中使用游标,因为它们可能会降低性能。要设计影响多行的触发器,请使用基于行集的逻辑而不是游标。
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