Спусковой механизм для массовой вставки - PullRequest
7 голосов
/ 30 апреля 2010
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

Это триггер, написанный для table(O_SALESMAN) для извлечения нескольких столбцов из него и вставки его друг в друга table(O_SALESMAN_USER). В настоящее время массовые данные вставляются в таблицу O_SALESMAN с помощью хранимой процедуры, где, поскольку триггер срабатывает только один раз, а O_SALESMAN_USER вставляет только одну запись каждый раз, когда выполняется хранимая процедура, я хочу, чтобы триггер запускался после каждой записи, которая вставляется в O_SALESMAN, так что обе таблицы должны иметь одинаковое количество, чего не происходит .. поэтому, пожалуйста, дайте мне знать, что можно изменить в этом триггере для достижения того же самого ...

Ответы [ 3 ]

7 голосов
/ 16 июля 2012

Вы можете использовать курсор следующим образом:

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
4 голосов
/ 30 апреля 2010

Да, срабатывает один раз за оператор, а не один раз за строку.

Итак, вам нужно что-то вроде:

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
1 голос
/ 02 мая 2010

Мой сценарий, (Табличные имена: Stock, StockLog)

Я вставляю массовые строки в таблицу Stock с помощью хранимой процедуры и хочу, чтобы все эти строки были внутри таблицы StockLog

сначала я делал то же самое, что и вы (по переменным) внутри моего триггера вставки для таблицы Stock но получаю ошибку, потому что с помощью

DECLARE @StocklId bigint

SET @StocklId = (SELECT StocklId FROM inserted)

У меня было несколько значений (SELECT StocklId FROM вставлен), когда я вставлял несколько строк, затем я удаляю все переменные, и теперь я делаю это

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

и теперь все хорошо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...