使用生成的值而不是触发器

时间:2010-09-21 12:43:11

标签: sql-server tsql

我有一张简单的表

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列为NULL。

感谢任何提示

2 个答案:

答案 0 :(得分:0)

在触发器内部,您可以获得您尝试插入的内容

Select * from INSERTED 

我不确定你在哪里获得你的proc所需的@ItemType来创建id

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

答案 1 :(得分:0)

我终于破解了它。这不是一个很好的解决方案(对我来说),但它有效:

  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