Как я могу передать ссылку на переменную из пакета, используя триггер, чтобы мне не нужно было жестко кодировать
Похоже, я не смог разобраться со своей проблемой должным образом, поэтому я решил снова задать свой вопрос в другой форме. У меня есть две таблицы с именами SALES_TABLE и PRODUCT_TABLE. Поэтому, когда я продаю товар из таблицы товаров, номер проданного товара (@sale_count) вычитается из общего количества того же товара на складе (pr_stock), и результат отображается в Product_table, а цифры для товара Идентификатор, номер продажи и название продукта должны вызываться с помощью:
INSERT INTO DBO.SALES_TABLE (SALE_COUNT,PROD_ID,Prod_name) VALUES (3,4, @prd_name )
и вставлен в Sales_table. Однако ссылка @prd_name, которая была инициализирована с помощью Product_name из таблицы продуктов, где PRODUCT_id = @PRD_ID выдает ошибку, поскольку она находится вне блока Begin и END.
Msgstr "Вы должны объявить скалярную переменную @prd_name".
Итак, как сделать так, чтобы переменная @prd_name передавалась из пакета, чтобы избежать жесткого кодирования Product_name в sale_table?
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 )
Обратите внимание, что:
INSERT INTO DBO.SALES_TABLE (SALE_COUNT,PROD_ID,Prod_name) VALUES (3,4, @prd_name )
это не часть триггера, это то, что должно запускать скрипт в предложениях Begin и End
1 ответ
Вам необходимо разобраться со случаем, когда несколько строк вставляются в один оператор, поскольку в SQL Server есть триггеры операторов, а не триггеры строк. Так что-то вроде этого:
alter TRIGGER DBO.TRG_STOCK
ON DBO.SALES_TABLE
AFTER INSERT
AS
BEGIN
with sold as
(
select prod_id, sum(sale_count) sale_count
from inserted
group by prod_id
), prod as
(
select p.prod_id, p.pr_stock, sold.sale_count
from sold
join product_table p
on sold.prod_id = p.prod_id
)
update prod set pr_stock = pr_stock - sale_count;
END
Кроме того, вы, кажется, вставляете product_name в таблицу продаж вместо product_id, чего не следует делать. Но вы можете сделать эту работу, изменив соединения.