2011-08-15 50 views
1

我正在使用insert-/update觸發器更新第二個表的列Price使用GROUP BY更新觸發器

插入觸發器似乎完美地工作,但是當我嘗試改變SSMS一個記錄,我得到一個錯誤:

The row value(s) updated or deleted either do not make the row unique or they alter multiple rows(2 rows).

這是我的更新觸發:

CREATE TRIGGER [dbo].[trgUpdateMasterData] ON [dbo].[tabSparePartMasterData_Temp] 
AFTER UPDATE 
AS 

UPDATE tabSparePart 
SET  Price = MD.Price 
FROM tabSparePart INNER JOIN 
(
    SELECT  inserted.[Material Number (SAP)] AS MaterialNumber, inserted.Price 
    FROM   inserted 
    GROUP BY [Material Number (SAP)], inserted.Price 
) MD 
ON tabSparePart.SparePartName = MD.MaterialNumber 

我需要按物料編號進行分組,因爲有多餘行插入tabSparePartMasterData_Temp表中,我只用它來更新tabSparePart中的備件價格。但是我認爲小組會根據重複的情況來整理(價格與任何重複相同)。

插入/更新記錄'MaterialNumbertabSparepart中可能不可用。在這種情況下,這個記錄應該被「跳過」。 INNER JOIN是否考慮到了這一點?

+0

什麼產生錯誤信息?它看起來不像SQL ... – gbn

+0

對'(tabSparePart.Price)'或'(tabSparePart.SparePartName,tabSparePart.Price)'有一個偶然的唯一約束嗎?如果有兩個或更多相同的'tabSparePart.SparePartName',則更新可能違反約束條件,也許這就是實際發生的情況。 –

+0

@gbn:SQL-Server Management-Studio(SSMS)當我嘗試使用觸發器更改表中的價格值時。 –

回答

5

嘗試增加SET NOCOUNT ON到觸發

此錯誤看起來並不像一個SQL錯誤,我猜的客戶端代碼得到由觸發器月2日更新混淆。

編輯:這個錯誤可能是由於SSMS中的數據網格視圖很愚蠢造成的。

這不是因爲我想到了一個SQL消息:這是一個SSMS愚蠢消息

看到這些,所有說「學寫SQL」

小號aying,有一個關於SQL Server 2005中的錯誤的KB article ...

+0

我已將觸發器更改爲「SET NOCOUNT ON」,但錯誤相同。 「第二次更新」是什麼意思?我正在更新與屬於此觸發器的表不同的表格。 –

+0

@Tim Schmelter:即使在不同的桌子上也有* 2 *更新。有些客戶會因此而感到困惑。 http://stackoverflow.com/questions/1483732/set-nocount-on-usage – gbn

+0

你是對的。我在觸發器的頂部添加了「NOCOUNT」,但我必須將它直接插入到「UPDATE」之上。謝謝。 –