为什么会出现错误“您必须声明标量变量@xxx”?

时间:2018-08-30 09:51:40

标签: sql-server tsql database-trigger

我有两个名为 SALES_TABLE PRODUCT_TABLE 的表。因此,每当我从产品表出售商品时,就会从库存中相同商品的总数(pr_stock)中减去出售商品的数量(sale_count),结果将显示在 Product_table ,而产品ID(product_id)和销售编号(sale_count)的数字写在 Sales_table 上。

我还希望将已售商品的名称显示在插入的表中,这就是为什么我声明了变量@prd_name并使用Product Table中的PRODUCT_id = @PRD_ID的Product_name对其进行了初始化的原因。但是我在执行过程中遇到了错误

  

“您必须声明标量变量@prd_name”。

这是什么原因?如何解决?

请注意:

INSERT INTO DBO.SALES_TABLE (SALE_COUNT,PROD_ID,Prod_name) VALUES (3,4, @prd_name )

是应该在BEGIN和END范围内触发上述脚本的东西。它不一定是它的一部分。 @prd_name应该从Product表中获取Product_Name的名称,并将其插入Sales_table的Prod_name列中。

alter TRIGGER DBO.TRG_STOCK
    ON DBO.SALES_TABLE
    AFTER INSERT
    AS
    BEGIN

    DECLARE @SALE_COUNT INT
    DECLARE @PRD_ID INT 
    declare @prd_name varchar(20) 

    SELECT @PRD_ID = PROD_ID, @SALE_COUNT = SALE_COUNT FROM INSERTED
    select @prd_NAME = PRODUCT_NAME from PRODUCT_TABLE where PRODUCT_id = @PRD_ID
    UPDATE PRODUCT_TABLE SET PR_STOCK =  PR_STOCK - @SALE_COUNT WHERE PRODUCT_id = @PRD_ID
    END


    INSERT INTO DBO.SALES_TABLE (SALE_COUNT,PROD_ID,Prod_name) VALUES (3,4, @prd_name )

1 个答案:

答案 0 :(得分:2)

您的触发器在END处结束(对此感到惊讶),但是您在@prd_name之后引用了END。变量仅存在于创建的同一批中,因此,当您运行INSERT语句时,@prd_name不再存在。

但是,您的触发器有缺陷,它希望一次只能插入一行;如果您插入2个(或更多),则触发器将无法按预期工作。这可能是您想要的 ,它将处理INSERT语句中的多行内容。:

ALTER TRIGGER dbo.TRG_STOCK
ON dbo.SALES_TABLE
AFTER INSERT
AS
BEGIN

    UPDATE PT
    SET PR_STOCK = PT.PR_STOCK - i.SALE_COUNT
    FROM inserted i
         JOIN PRODUCT_TABLE PT ON i.Prod_id = PT.PRODUCT_id;

    INSERT INTO dbo.SALES_TABLE (SALE_COUNT,
                             PROD_ID,
                             Prod_name)
    SELECT 3,4,PT.PRODUCT_NAME
    FROM inserted i
         JOIN PRODUCT_TABLE PT ON i.Prod_id = PT.PRODUCT_id;
END;
相关问题