Как я могу передать ссылку на переменную из пакета, используя триггер, чтобы мне не нужно было жестко кодировать - PullRequest
0 голосов
/ 30 августа 2018

Похоже, я не смог разобраться со своей проблемой должным образом, поэтому я решил снова задать свой вопрос в другой форме. У меня есть две таблицы с именами 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.

«Вы должны объявить скалярную переменную @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 Ответ

0 голосов
/ 30 августа 2018

Вам необходимо обработать случай, когда несколько строк вставляются в один оператор, поскольку 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, чего не следует делать. Но вы можете сделать это, изменив соединения.

...