2010-10-20 73 views
2

我仍然試圖得到正確的觸發器,但是當工作時似乎其他開始(失敗)。惱人的..但也教育:-)爲什麼「子查詢返回的值超過1,這是不允許的......」在觸發器中的相同查詢,而不是執行正常查詢

當我執行下面的SQL在MS SQL服務器是成功完成,但是當它在一個AFTER UPDATE觸發器執行的時候失敗,錯誤

消息512 ,級別16,狀態1,過程 TR_PHOTO_AU,第37行子查詢返回 多於1個值。當子查詢遵循= !=,<,< =,>,> =或當子查詢 用作表達式時,這不是 。

SQL;

 UPDATE p2 
     SET p2.esb = '0' 
     FROM (SELECT TOP(5) p1.esb 
       FROM SOA.dbo.photos_TEST p1 
       WHERE p1.esb = 'Q' 
       ORDER BY p1.arrivaldatetime ASC 
     ) p2 

爲什麼不允許在觸發器中使用子查詢作爲表達式?是否有解決方法?

再次感謝, 彼得

回答

0

你能試試嗎?請務必在EXISTS條款中指定列中的所有列爲WHERE

UPDATE p1 
SET  p1.esb = '0' 
FROM SOA.dbo.photos_TEST p1 
WHERE EXISTS (SELECT TOP 5 
         * 
       FROM SOA.dbo.photos_TEST p2 
       WHERE p1.<KEYFIELD> = p2.<KEYFIELD> 
         AND p2.esb = 'Q' 
       ORDER BY p1.arrivaldatetime ASC) 
+0

感謝Brad,但找到原因。我正在嘗試3天來解決軟件供應商無法/不會/不管/無論什麼問題。我變得馬虎,並將我的更新後觸發器定義爲插入後更新觸發器。解決這個問題也解決了錯誤。 – pcvnes 2010-10-20 12:56:43

+0

@pcvnes,你應該回答你自己的問題,這樣你可以標記爲已被回答。 – Brad 2010-10-20 13:02:28

+0

據我所知,可以看到,我做了我的問題。 – pcvnes 2010-10-21 06:28:57

1

該溶液在一個完整的不同方向被發現,我不期而遇定義了扳機作爲插入之後,更新觸發而不是更新後觸發。以下觸發定義現在可以工作

CREATE TRIGGER TR_PHOTO_AU 
    ON  SOA.dbo.photos_TEST 
    AFTER UPDATE 
AS 

DECLARE @MAXCONC INT -- Maximum concurrent processes 
DECLARE @CONC INT  -- Actual concurrent processes 

SET @MAXCONC = 1  -- 1 concurrent processes 

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON 

-- If column esb is involved in the update, does not necessarily mean 
-- that the column itself is updated 
If (Update(ESB)) 
BEGIN 
    -- If column esb has been changed to 1 or Q 
    IF ((SELECT esb FROM INSERTED) in ('1','Q')) 
    BEGIN 
     -- count the number of (imminent) active processes 
     SET @CONC = (SELECT COUNT(*) 
        FROM SOA.dbo.photos_TEST pc 
        WHERE pc.esb in ('0','R')) 

     -- if maximum has not been reached 
     IF NOT (@CONC >= @MAXCONC) 
     BEGIN 
      -- set additional rows esb to '0' to match @MAXCONC 
      UPDATE TOP(@[email protected]) p2 
      SET p2.esb = '0' 
      FROM (SELECT TOP(@[email protected]) p1.esb 
        FROM SOA.dbo.photos_TEST p1 
        WHERE p1.esb = 'Q' 
        ORDER BY p1.arrivaldatetime ASC 
      ) p2 

     END 
    END 
END 
相關問題