【问题标题】:Error Msg 4145, Level 15, State 1, An expression of non-boolean type错误消息 4145,级别 15,状态 1,非布尔类型的表达式
【发布时间】:2012-12-10 19:43:15
【问题描述】:

当我尝试执行此语句时,我收到以下错误消息:

消息 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 值“数量”转换为数据类型 int 时转换失败。

当我尝试在触发器之后执行此语句时:

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

【问题讨论】:

    标签: sql sql-server syntax error-handling boolean


    【解决方案1】:

    您的if 语句没有可比性。也许你的意思是这样的:

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

    查看是否返回任何行。

    【讨论】:

    • 您在此触发器中没有名为“数量”的变量。目前尚不清楚它指的是什么。 quantity_in_stock 和 unis_on_order 的数据类型是什么?
    • 他们都是int。引发此语句的最初问题是:在 order_details 表上创建一个名为 tr_check_qty 的 INSERT 和 UPDATE 触发器,以仅允许订购库存数量大于或等于订购单位的产品。运行以下查询以验证您的触发器。 UPDATE order_details SET quantity=30 WHERE order_id=10044 AND product_id=7;去
    【解决方案2】:

    我认为您也需要引用插入的行,例如 here

    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
    

    【讨论】:

      猜你喜欢
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      相关资源
      最近更新 更多