SQL Server触发多行

时间:2016-08-15 09:28:08

标签: sql-server triggers

我有一个触发器:

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的多行插入行表?似乎我的代码仅适用于单行。

2 个答案:

答案 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