0

このステートメントを実行しようとすると、次のエラーメッセージが表示されます。

メッセージ4145、レベル15、状態1、プロシージャtr_check_qty、8行目
'BEGIN'の近くで、条件が予期されるコンテキストで指定された非ブール型の式

以前にこのエラーメッセージを受け取りましたが、今回は修正方法がわかりません。私はこれを生き生きとプログラムする人さえいました、そして彼が疲れ果てて忙しい間、彼は私の構文の問題を見つけることができませんでした。ヘルプ!

CREATE TRIGGER tr_check_qty
ON order_details
FOR INSERT, UPDATE
AS
   IF (SELECT quantity_in_stock
       FROM products
       WHERE quantity_in_stock >= units_on_order)
   BEGIN
      PRINT 'Insert/Update Not Allowed: quantity_in_stock less than units_on_order.'
      ROLLBACK TRANSACTION
   END;
GO

さて、私は今このステートメントを実行することができます:

CREATE TRIGGER      tr_check_qty
ON                  order_details
FOR INSERT, UPDATE
AS
IF EXISTS           (   SELECT      COUNT(inserted.order_id)
                    FROM        inserted
                    INNER JOIN  products ON products.product_id=inserted.product_id
                    WHERE       inserted.quantity>products.quantity_in_stock)
BEGIN
PRINT 'Insert/Update Not Allowed: quantity_in_stock less than units_on_order.'
ROLLBACK TRANSACTION
END;
GO

しかし今、私はこのエラーを受け取っています:

メッセージ245、レベル16、状態1、行1 varchar値'quantity'をデータ型intに変換するときに、変換に失敗しました。

トリガーに続いてこのステートメントを実行しようとすると、次のようになります。

UPDATE order_details
SET quantity=30
WHERE order_id=10044 AND product_id=7;
GO
4

2 に答える 2

1

ここのように、挿入された行も参照する必要があると思います

CREATE TRIGGER tr_check_qty
3>    ON order_details
4>    FOR INSERT, UPDATE
5> AS
6>    IF EXISTS
7>       (
8>        SELECT 'True'
9>        FROM Inserted i
10>        JOIN products p
11>          ON i.ID = p.ID
          WHERE       quantity_in_stock >= units_on_order
12>       )
13>    BEGIN
14>        PRINT 'Insert/Update Not Allowed: quantity_in_stock less than units_on_order.'
15>        ROLLBACK TRAN
16> END
于 2012-12-10T19:49:45.793 に答える
1

あなたのif発言は比較になりません。おそらく、次のような意味です。

IF   EXISTS (   SELECT      quantity_in_stock
                FROM        products
                WHERE       quantity_in_stock >= units_on_order )

行が返されるかどうかを確認します。

于 2012-12-10T19:48:34.950 に答える