2012-03-28 67 views
0

我試圖創建一個更新觸發器,用於檢查某個產品的庫存量,以及某人訂購的產品的數量並顯示如果該產品沒有足夠的信息有貨。搜索具有特定插入值的行,然後將該行中的值與插入值進行比較

它讓我創建觸發器,但測試時,它會顯示一個錯誤「子查詢返回多個值。當子查詢遵循=,!=,...這是不允許的」

我我並沒有真正理解它是如何返回多個值的,因爲我已經搜索具有與插入值相匹配的產品ID的特定行。然後我將它與插入的值進行比較。

這是我到目前爲止有:

CREATE TRIGGER tr_check_qty 
ON OrderDetails 
FOR UPDATE 
AS 
DECLARE @ProductID int, 
    @Quantity int 

SELECT @ProductID = ProductID, 
    @Quantity = Quantity 
FROM inserted 
WHERE @ProductID = (SELECT ProductID FROM Products) 

IF 
@Quantity > (SELECT UnitsInStock FROM Products) 
BEGIN 
    PRINT 'Not enough product in stock' 
    ROLLBACK TRANSACTION 
END 
+3

你的觸發器壞了 - 你假定'inserted'只包含一行,這是*不是一般的假設。 (觸發器每個*語句*運行一次,而不是每個*行*一次) – 2012-03-28 06:56:18

回答

0

SELECT UnitsInStock FROM Products以及SELECT ProductID FROM Products可能會返回一個整列,而不是一個單一的值。你應該在那裏指定一些限制,如WHERE id = @someId

+0

謝謝!那樣做了! – Serenity 2012-03-28 07:05:54

0

您有更多的產品正確嗎?

,這一行:

WHERE @ProductID = (SELECT ProductID FROM Products) 

這行:

@Quantity > (SELECT UnitsInStock FROM Products) 

將返回多行。

請注意,如果您插入多於一行。該inserted表將有更多然後一排以及

您可能要不得不做這樣的事情:

IF EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      inserted 
     WHERE EXISTS 
      (
       SELECT 
        NULL 
       FROM 
        Product 
       WHERE 
        Product.Quantity>inserted.Quantity 
      ) 
    ) 
BEGIN 
    PRINT 'Not enough product in stock' 
    ROLLBACK TRANSACTION 
END 
1

認爲你想要的東西,如:

CREATE TRIGGER tr_check_qty 
ON OrderDetails 
FOR UPDATE 
AS 
IF EXISTS (
    SELECT * 
    FROM 
     Products p 
      inner join 
     inserted i 
      on p.ProductID = i.ProductID 
    WHERE i.Quantity > p.UnitsInStock) 
BEGIN 
    PRINT 'Not enough product in stock' 
    ROLLBACK TRANSACTION 
END 

然而,我有點迷惑,爲什麼這是在更新觸發器,爲什麼這是一個插入觸發器。

+0

一個愚蠢的猜測:這是一個觸發*更新*,即它應該更新您的信息,沒有足夠的產品庫存。 :)雖然認真,我認爲它應該是更新和插入。 – 2012-03-28 07:06:43

+0

這是一個更新,因爲訂單已經存在......只是如果你想改變產品。但是,謝謝,這有助於:) – Serenity 2012-03-28 07:09:16

+0

啊,好點...我想這可能應該是兩個。謝謝! – Serenity 2012-03-28 07:10:03