2010-04-30 3 views
3
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, так что обе таблицы должны иметь одинаковый счет, который не происходит. Пожалуйста, дайте мне знать, что можно изменить в этом триггере, чтобы достичь того же ....Обжиг триггера для сыпучей вставка

+0

может быть стоит ваше разъяснение значит ли BULK INSERT (HTTP: //msdn.mic rosoft.com/en-us/library/ms188365.aspx), где вам необходимо включить FIRE_TRIGGERS или просто многострочный INSERT (http://msdn.microsoft.com/en-us/library/ms174335.aspx) –

ответ

1

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

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

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 
0

Мой scenerio есть, (таблица имен: Шток, StockLog)

Я вставив объемные строки внутри фондовой таблицы с помощью хранимой процедуры и хотите также все эти строки внутри StockLog таблицы

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

DECLARE @StocklId bigint 

SET @StocklId = (SELECT StocklId FROM inserted) 

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

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 

и теперь все нормально

5

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

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 
+2

http://msdn.microsoft.com/en-us/library/ms190752.aspx «Мы не рекомендуем использовать курсоры в триггерах, потому что они могут потенциально снизить производительность. Чтобы создать триггер, который влияет на несколько строк, вместо курсоров используйте логику на основе набора строк. " –

Смежные вопросы