2011-08-24 35 views
2

我有以下觸發器。在插入新行時,存儲過程無法獲取變量@ItemID的參數值。我想新插入行ITEMID列的值傳遞給存儲過程CalculateCurrentStockSQL觸發器執行問題

ALTER TRIGGER UpdateCurrentStock 
    ON StockIn 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    EXEC CalculateCurrentStock (SELECT ItemID From INSERTED) 
END 

錯誤文本讀取

過程或函數「CalculateCurrentStock」預計參數 「@ItemID」,那是不供給的。該語句已終止。

謝謝你的幫助。

編輯:回答

我已經改變了觸發按德里克Kromm的和KM的建議

ALTER TRIGGER UpdateCurrentStock 
    ON StockIn 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @CSV varchar(max) 
    SELECT @CSV=ISNULL(@CSV+',','')+ItemID From INSERTED 
    EXEC CalculateCurrentStock @CSV 


END 

感謝您的幫助:)

+1

元帥,即ISN不是我所建議的。如果更新單行,您的修改後的觸發器纔會起作用。如果你更新多行,它將不起作用。 –

+2

**如果您的'INSERTED'表中包含多行,'edit'將會失敗。**最好的做法是始終編寫觸發器以支持'INSERTED'和/或'DELETED'中的多行。在單個語句中插入/更新/刪除多行是相當容易和常見的,任何只處理單行的觸發器都將以「邏輯」方式失敗,而不會出現錯誤消息(數據會混亂)。嘗試一下,看看你的觸發器失敗:INSERT INTO StockIn(col1,col2,...)SELECT TOP 3 col1,col2,... FROM StockIn ORDER BY ItemID'這個假定ItemID是一個身份PK。 –

+0

我重新編輯了答案。感謝Derek和KM提供的寶貴輸入 – Marshal

回答

2

在使用遊標之前,我會親自指出自己的眼睛,特別是當您可以在一次過程調用中同時傳入一組值(表值參數或CSV)時。

如果您正在運行SQL Server 2008中,你可以使用Table-Valued Parameters創建你的程序,應該能夠在INSERTED表通過。

如果您正在使用SQL Server 2005,則可以在varchar(max)變量內創建逗號分隔值(csv)值列表,並將其傳遞給您的過程。

編輯,這裏是如何在一個CSV通過

ALTER TRIGGER UpdateCurrentStock 
    ON StockIn 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @CSV varchar(max) 
    SELECT @CSV=ISNULL(@CSV+',','')+ItemID From INSERTED 
    EXEC CalculateCurrentStock @CSV 
END 

現在,在你需要裂開的@CSV值,所以看這裏:Pass a list-structure as an argument to a stored procedure

+0

@KM:我使用的SQL Server 2005。所以,在我的具體情況,我可以轉換'(選擇項ID從安裝)'以CSV值? – Marshal

3

編輯:正如馬丁指出,如果您使用SQL Server 2008,則可以傳遞一個表值參數。如果您使用的是2005或更早版本,則無法這樣做。 KM建議在這種情況下使用以逗號分隔的值,這是我個人不同意的。

實際上,您應該將存儲過程邏輯直接複製到觸發器中,並避免整個混亂。

+0

我很抱歉,我是sql觸發器的新手。我不明白我應該爲插入的'放置什麼。再次感謝您的幫助 – Marshal

+0

請參閱編輯例如 –

+0

您是否看到過我的編輯?這是目前的作品。你的代碼在執行時更安全嗎? – Marshal