我有两个名为 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 )
答案 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;