2010-10-19 54 views
2

我對數據庫沒有那麼有經驗,所以對我一無所知。 ;-) 當一次插入多行時,一個非常簡單的FOR INSERT觸發器會一直返回錯誤「Subquery返回多個值」。當我使用像這樣的語句將行插入到表SOA.dbo.photos_TEST中時;子查詢返回的值超過1。在MS SQL 2005觸發器上

INSERT INTO SOA.dbo.photos_TEST (id,length,picture,type,name,value,arrivaldatetime) 
SELECT VW.id, ... , 
FROM SOA.dbo.AeosPhotoTEST_VW vw 
WHERE ... 

插入失敗。但是當我添加一個TOP(1)到SELECT語句時,觸發器不報告錯誤。因此,觸發器中的「SELECT VALUE FROM INSERTED」語句可能會返回INSERTED表中的所有行。我是否應該在觸發器中循環遍歷INSERTED中的所有行?任何建議都是值得歡迎的。

觸發器的當前代碼是;

SELECT @VALUE = (SELECT VALUE FROM INSERTED) 

SET NOCOUNT ON 

BEGIN 
    DELETE FROM SOA.dbo.photos_TEST 
    WHERE (value = @VALUE) 
    AND (arrivaldatetime < (SELECT arrivaldatetime 
       FROM INSERTED 
       WHERE value = @VALUE)) 
END 

回答

3

修改T-SQL觸發器刪除的邏輯如下:

DELETE A 
FROM SOA.dbo.photos_TEST A 
    INNER JOIN INSERTED B on 
     A.VALUE = B.VALUE 
WHERE A.arrivaldatetime < B.arrivaldatetime 
+0

你好約翰,改變的是觸發如你所說仍返回「子查詢返回多個值。該......當這是不允許的」,並稱超過1個行時。 – pcvnes 2010-10-19 12:17:35

+0

+1教我一個新的竅門。非常感謝,thx。 – 2010-10-19 12:19:23

+0

@pcvnes,它不應該。你確定你改變了觸發器嗎?你能發佈更新後的腳本嗎? – 2010-10-19 12:22:48

1

我假設你需要刪除所有舊值。調整你的觸發器如下所示。

觸發

BEGIN 
    DELETE p 
    FROM SOA.dbo.photos_TEST p 
      INNER JOIN INSERTED i ON i.Value = p.Value 
            AND i.ArrivalDateTime > p.ArrivalDateTime 
    END 
+0

不客氣,我的朋友。我也知道你的意思。我不再學習的那一天是我尋找新職業的一天! – 2010-10-19 12:31:55

+0

@John,thx編輯。我仍然很興奮學習新的,更快的做事方式。 :) – 2010-10-19 12:33:27

+0

嗨列文,謝謝!這一個也有效!當您向表中插入多行時,INSERTED表是否包含多行,並且觸發器僅執行一次?我認爲每一行更新都會導致一個單獨的觸發事件。 – pcvnes 2010-10-19 12:38:50

相關問題