используя сгенерированные значения вместо триггеров - PullRequest
1 голос
/ 21 сентября 2010

У меня есть простая таблица

CREATE TABLE tItem (PK_Item INT ITENTITY(1,1) NOT NULL, ItemID VARCHAR(15) NOT NULL)

, где ItemID является сгенерированным идентификатором, обычно числом, но может отличаться в зависимости от клиента и других условий.

ItemID является результатом EXEC @TempID = pGeneralIdentifierRetrieve NULL, NULL, @ItemType

В настоящее время у меня есть вставка новых записей, записанных в хранимой процедуре, и она работает нормально.

Я хотел бы попытаться переписать вставку в триггер INSTEAD OF.У меня есть одна проблема - как ссылаться на строки в таблице INSERTED, чтобы я мог обновить их с новым ItemID.Я понимаю, что могу установить его в AFTER INSERT TRIGGER, но для этого потребуется, чтобы столбец ItemID был пустым.

Спасибо за любые подсказки

Ответы [ 2 ]

0 голосов
/ 21 сентября 2010

Я наконец взломал его.Это не хорошее решение (для меня), но оно работает:

  SELECT * INTO #MyInserted FROM INSERTED 
    SELECT @RowCount = COUNT(*) FROM #MyInserted WHERE ItemID IS NULL

    WHILE @RowCount > 0 
    BEGIN 
       EXEC @TempID = pGeneralIdentifierRetrieve NULL, NULL, @ItemType 
       UPDATE TOP (1) #MyInserted SET ItemID = @TempID WHERE ItemID IS NULL 
       SET @RowCount = 0 
       SELECT @RowCount = COUNT(*) FROM #MyInserted WHERE ItemID IS NULL
    END 

   INSERT INTO tItem (ItemID) SELECT (ItemID) FROM #MySelected
0 голосов
/ 21 сентября 2010

Внутри триггера вы можете получить то, что пытались вставить

Select * from INSERTED 

Я не уверен, где вы получите @ItemType, необходимый вашему процессу для создания идентификатора

create trigger ti_tItem
on tItem
instead of insert
as
begin try
    insert into tItem(ItemID)
    select TempID from [The same code in your procedure]
    where [something] = @ItemType
end try

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