Sql server 在触发器sql server上使用Select case

Sql server 在触发器sql server上使用Select case,sql-server,triggers,Sql Server,Triggers,当我从插入的表中选择case时,我卡住了这个触发器,结果为NULL TRIGGER trgInsertPenjDetail ON [dbo].[TbDtlOutBrgGd1] AFTER INSERT AS BEGIN DECLARE @namaProduct varchar (255) DECLARE @jenisProduct varchar (50) SET @jenisProduct = (select jenis from Inserted)

当我从插入的表中选择case时,我卡住了这个触发器,结果为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的正确语法是什么?谢谢。

我会更改触发器的顶部,使触发器看起来像这样:

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


我假设查询的底部只是为了确保被替换为+。

在我使用if-else修改@Jaques的response之后,该代码可以工作。谢谢你花时间回答

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 

我认为这不是@namaProduct。您是否检查了b.rek和i.ket?SET@jenisProduct=select jenis from Inserted is break-INSERTs可以插入多行。对整个批次调用一次触发器。inserted类似于一个表是有原因的——你应该把它当作一个表来对待。你关于多个inserted的观点几乎是正确的——然而,如果多个插入的行具有相同的nott值,那么更新的行为是不可想象的。它可以对目标行执行一次更新。不太可能实现OP期望的所有更新。谢谢@Damien_,不信者