我有一个触发器:
ALTER TRIGGER [dbo].[tg_trs_uharian] ON [dbo].[master_st]
AFTER INSERT AS
BEGIN
SET NOCOUNT ON
declare @tgl_mulai varchar(10),
@tgl_selesai varchar(10),
@kdlokasi int,
@thn_harian int,
@date_diff int
declare @tugasID int;
declare @uangharian20 decimal(15,2);
declare @uangharian80 decimal(15,2);
declare @uangharian100 decimal(15,2);
select @tugasID=tugasID
from inserted
SET @thn_harian=CAST(YEAR(CONVERT(datetime, @tgl_mulai, 103)) AS INT);
SET @date_diff=((SELECT datediff(day,CONVERT([datetime],@tgl_mulai,(103)),CONVERT([datetime],@tgl_selesai,(103))))+1);
SET @uangharian100 = (
SELECT k.uh_nominal
FROM master_st m
LEFT OUTER JOIN ref_uharian AS k
ON k.uh_kdlokasi=m.kdlokasi AND k.uh_tahun=@thn_harian);
insert into trs_uangharian (tugasID, uangharian100) values
(@tugasID, @uangharian100);
END
如何使select @tugasID=tugasID from inserted
适用于具有不同tugasID
的多行插入行表?似乎我的代码仅适用于单行。
答案 0 :(得分:2)
似乎没有使用@date_diff 你使用@thn_harian所以我们需要@tgl_mulai,但默认情况下它是NULL 所以你的INSERT语句有一些问题。 我假设@tgl_mulai是原始表master_st的一列,所以我将其视为“插入”触发器内部表的列
ALTER TRIGGER [dbo].[tg_trs_uharian] ON [dbo].[master_st]
AFTER INSERT AS
BEGIN
SET NOCOUNT ON
insert into trs_uangharian(tugasID, uangharian100)
select
i.tugasID,
k.uh_nominal
from inserted i
left join ref_uharian AS k
ON k.uh_kdlokasi = i.kdlokasi AND
k.uh_tahun = CAST(YEAR(CONVERT(datetime, i.tgl_mulai, 103)) AS INT)
END
请注意,这是新SQL开发人员的常见问题 SQL triggers以工作集为基础。 不要使用变量计算任何值。 这些只能存储最后一行的计算。
而是使用Inserted和Deleted内部表。
答案 1 :(得分:1)
你的查询搞砸了,所以我只提供一般解决方案。在这样的事情上改变INSERT部分:
INSERT INTO trs_uangharian (tugasID, uangharian100)
SELECT i.tugasID,
k.uh_nominal
FROM inserted i
LEFT JOIN ref_uharian AS k
ON k.uh_kdlokasi=i.kdlokasi AND k.uh_tahun=@thn_harian