Sql server 在触发器sql server上使用Select case
当我从插入的表中选择case时,我卡住了这个触发器,结果为NULLSql 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)
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_,不信者