Использование Select case на триггере SQL Server - PullRequest
1 голос
/ 13 марта 2012

Я застрял в этом триггере, когда использую для выбора регистр из вставленной таблицы, результат был NULL.

 TRIGGER trgInsertPenjDetail ON [dbo].[TbDtlOutBrgGd1] 
 AFTER INSERT

 AS

BEGIN
    DECLARE @namaProduct varchar (255)
    DECLARE @jenisProduct varchar (50)
    SET @jenisProduct = (select jenis from Inserted) 

    SELECT @namaProduct =
        CASE @jenisProduct
                    WHEN 'PAKET'
                               THEN (SELECT tb.nm AS namaProduct from dbo.TbHdPaket AS tb
                INNER JOIN Inserted AS i ON tb.id = i.brg)
                    WHEN 'TERAPI'
                               THEN (SELECT tb.nm AS namaProduct from dbo.TbMterapi AS tb
                INNER JOIN Inserted AS i ON tb.id = i.brg)
            WHEN 'BARANG'
                               THEN (SELECT tb.nama AS namaProduct from dbo.TbMstBb AS tb
                INNER JOIN Inserted AS i ON tb.id = i.brg)
                    ELSE '-'
                END


    BEGIN
        UPDATE b
        SET b.rek = b.rek + '( ' + convert(varchar(5),i.qty) + ' ' + @namaProduct+' ' + i.ket+ ' )'
        FROM dbo.TbRek AS b
        INNER JOIN Inserted AS i ON b.nott = i.nott
    END
    BEGIN
        UPDATE b
        SET    b.rek = replace(b.rek, ')(', '+')
        FROM dbo.TbRek AS b
        INNER JOIN Inserted AS i ON b.nott = i.nott
    END
END

Каков правильный синтаксис для CASE или IF для этого триггера? Спасибо.

Ответы [ 2 ]

3 голосов
/ 13 марта 2012

Я бы изменил верхнюю часть триггера так, чтобы триггер выглядел так:

CREATE TRIGGER trgInsertPenjDetail ON [dbo].[TbDtlOutBrgGd1]  
 AFTER INSERT 
 AS 
BEGIN 
    BEGIN 
        UPDATE b 
        SET b.rek = b.rek + '( ' + convert(varchar(5),i.qty) + ' ' + 
        CASE i.jenis 
            WHEN 'PAKET'  THEN nama1
            WHEN 'TERAPI' then name2
            WHEN 'BARANG' THEN nama3
            ELSE '-' 
        END + ' ' + i.ket+ ' )' 
        FROM dbo.TbRek AS b 
        INNER JOIN (Select qty, jenis, ket, t1.nm as nama1, t2.nm as nama2, t3.nama as nama3 from Inserted as i
                        LEFT JOIN TbHdPaket as t1 on i.brg = t1.id
                        LEFT JOIN TbMterapi as t2 on i.brg = t2.id
                        LEFT JOIN TbMstBb as t3 on i.brg = t3.id) AS i ON b.nott = i.nott 
    END 
    BEGIN 
        UPDATE b 
        SET    b.rek = replace(b.rek, ')(', '+') 
        FROM dbo.TbRek AS b 
        INNER JOIN Inserted AS i ON b.nott = i.nott 
    END 
END 

Таким образом, даже при множественных вставках вставленная таблица должна обновлять TbRek всем, что обновляется.

Я предполагаю, что нижняя часть запроса просто для того, чтобы убедиться, что ") (" заменяется на "+".

0 голосов
/ 17 марта 2012

Этот код работает после того, как я изменю ответ @ Jaques, используя if else. Спасибо, что нашли время ответить.

CREATE  TRIGGER trgInsertPenjDetail ON [dbo].[TbDtlOutBrgGd1]  
AFTER INSERT 
AS 
BEGIN 
    DECLARE @namaProduct varchar (255)

    DECLARE @jenis varchar (50)

    SELECT @jenis = (select jenis from inserted)

    IF @jenis = 'PAKET'
        SELECT @namaProduct = (SELECT tp.nm AS namaProduct from dbo.TbHdPaket AS tp
                INNER JOIN Inserted AS i ON tp.id = i.brg)
    ELSE IF @jenis = 'TERAPI'
        SELECT  @namaProduct = (SELECT tt.nm AS namaProduct from dbo.TbMterapi AS tt
                INNER JOIN Inserted AS i ON tt.id = i.brg)
    ELSE SELECT  @namaProduct = (SELECT tb.nama AS namaProduct from dbo.TbMstBb AS tb
                INNER JOIN Inserted AS i ON tb.id = i.brg)

    BEGIN 

        UPDATE b 
        SET b.rek = b.rek + '( ' + convert(varchar(5),i.qty) + ' ' + @namaProduct + ' ' + i.ket+ ' )' 
        FROM dbo.TbRek AS b 
        INNER JOIN Inserted AS i ON b.nott = i.nott
    END 
    BEGIN 
        UPDATE b 
        SET    b.rek = replace(b.rek, ')(', '+') 
        FROM dbo.TbRek AS b 
        INNER JOIN Inserted AS i ON b.nott = i.nott 
    END 
END 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...