我有一個觸發器管理來自另一個表的批量加載。將大量的行插入到「項目」表中時。觸發器被觸發,但是當插入表中的行已經存在時,條件不起作用。如果條件不起作用在觸發器
此觸發器的用途是將插入到項目表中的新行插入到vat_matrix表中。如果vat_matrix表中存在行,則使用項目表中的新值更新它們。
我已經嘗試了幾個選項,發現遊標是遍歷插入行的唯一解決方案。這工作,但我不能讓if條件工作來更新現有的行。
有什麼建議嗎?
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[update_vat] ON [dbo].[projects]
FOR UPDATE, INSERT
AS
DECLARE @project AS VARCHAR(25)
DECLARE @client AS VARCHAR(25)
DECLARE @dim2 AS VARCHAR(25)
DECLARE @period_from AS INT
DECLARE @period_to AS INT
DECLARE @status AS CHAR(1)
DECLARE @user_id AS VARCHAR(25)
DECLARE @unit_id AS VARCHAR(25)
DECLARE @sequence_no AS INT
SELECT @project = project,
@client = client,
@dim2 = dim2,
@period_from = period_from,
@period_to = period_to,
@status = status,
@user_id = user_id,
@unit_id = unit_id
FROM inserted
--FIND MAXIMUM VALUE FOR SEQUENCE NUMBER
SET @sequence_no = (SELECT MAX(v) FROM (SELECT sequence_no FROM agldefmatdet WHERE matrix_id = 11) AS value(v));
BEGIN
DECLARE tbl_cursor CURSOR LOCAL FOR
SELECT project, client, dim2, period_from, period_to, status, user_id, unit_id FROM inserted
SET NOCOUNT ON;
IF EXISTS (SELECT * FROM inserted WHERE inserted.project = @project) AND NOT EXISTS (SELECT * FROM deleted WHERE deleted.project = @project)
BEGIN
OPEN tbl_cursor
FETCH NEXT FROM tbl_cursor INTO @project, @client, @dim2, @period_from, @period_to, @status, @user_id, @unit_id
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO [dbo].[vat_matrix]
(att_val_from_1,
att_val_from_2,
att_val_from_3,
att_val_from_4,
att_val_to_1,
att_val_to_2,
att_val_to_3,
att_val_to_4,
att_value_1,
att_value_2,
att_value_3,
att_value_4,
client,
dim_value,
last_update,
matrix_id,
period_from,
period_to,
sequence_no,
status,
user_id)
SELECT @project,
'',
'',
'',
@project,
'',
'',
'',
@project,
'',
'',
'',
@client,
@dim2,
GETDATE(),
'11',
'0',
'0',
@sequence_no + 1,
@status,
@user_id
FETCH NEXT FROM tbl_cursor INTO @project, @client, @dim2, @period_from, @period_to, @status, @user_id, @unit_id
--RETURN;
END
CLOSE tbl_cursor
DEALLOCATE tbl_cursor
END
IF EXISTS (SELECT * FROM inserted WHERE inserted.project = @project) AND EXISTS (SELECT * FROM deleted WHERE deleted.project = @project)
BEGIN
OPEN tbl_cursor
FETCH NEXT FROM tbl_cursor INTO @project, @client, @dim2, @period_from, @period_to, @status, @user_id, @unit_id
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE vat_matrix
SET dim_value = @dim2,
last_update = GETDATE(),
period_from = @period_from,
period_to = @period_to,
status = @status,
user_id = @user_id
WHERE att_val_from_1 = @project
AND matrix_id = '11'
AND client = 'LU'
FETCH NEXT FROM tbl_cursor INTO @project, @client, @dim2, @period_from, @period_to, @status, @user_id, @unit_id
END
CLOSE tbl_cursor
DEALLOCATE tbl_cursor
--RETURN;
END
END;
'觸發器'內的'CURSOR'。看起來不好主意 –
我發現它是遍歷Tigger中插入表中新行的唯一方法。現在唯一的問題是如果條件 – user3565164