2010-09-21 61 views
1

我有一個簡單的表使用生成的值在代替觸發器

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列爲無效。

感謝任何提示

回答

0

內觸發,你可以得到你試圖插入

Select * from INSERTED 

我,你會得到@ItemType需要由PROC創建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 
+0

感謝,傑夫,但是使用簡單的SELECT語句,我不能讓TempID :-( – Harnod 2010-09-21 13:33:08

+0

@Harnod - 你仍然可以聲明@TempID變量並將其設置爲你想要的任何transact-sql或CLR批次。 – JeffO 2010-09-21 13:53:27

+0

Jeff,對於一行爲true,當我有多個插入的行時,值不能爲常數 – Harnod 2010-09-21 13:56:57

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