I have a problem with an "upsert" trigger, being triggered by a SSIS package with fastload. (FIRE_TRIGGERS is enabled)
CREATE TRIGGER [dbo].[MP_VOL_UPSERT]
ON [dbo].[vwMP_VOL]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE [dbo].[vwMP_VOL]
SET
[vwMP_VOL].[id_batch] = inserted.id_batch
,[vwMP_VOL].[id_invoice] = inserted.id_invoice
,[vwMP_VOL].[text_vchr] = inserted.text_vchr
,[vwMP_VOL].[amt_frt_tcur] = inserted.amt_frt_tcur
,[vwMP_VOL].[amt_line_hcur] = inserted.amt_line_hcur
,[vwMP_VOL].[line_total_hcur] = inserted.line_total_hcur
,[vwMP_VOL].[id_tax_1] = inserted.id_tax_1
,[vwMP_VOL].[id_tax_2] = inserted.id_tax_2
,[vwMP_VOL].[id_tax_3] = inserted.id_tax_3
,[vwMP_VOL].[id_tax_4] = inserted.id_tax_4
,[vwMP_VOL].[line_total_rem_hcu] = inserted.line_total_rem_hcu
,[vwMP_VOL].[id_po] = inserted.id_po
,[vwMP_VOL].[cnt_rlse] = inserted.cnt_rlse
,[vwMP_VOL].[cnt_line_nbr] = inserted.cnt_line_nbr
FROM inserted
INNER JOIN (SELECT [Org]
,[id_vend]
,[id_org_orig]
,[id_vchr_nbr]
,[id_vchr_line]
FROM [vwMP_VOL]) AS old
ON old.[Org] = inserted.Org
AND old.[id_vend] = inserted.id_vend
AND old.[id_org_orig] = inserted.id_org_orig
AND old.[id_vchr_nbr] = inserted.id_vchr_nbr
AND old.[id_vchr_line] = inserted.id_vchr_line;
INSERT INTO [dbo].[vwMP_VOL]
SELECT inserted.* FROM inserted
LEFT JOIN (SELECT [Org]
,[id_vend]
,[id_org_orig]
,[id_vchr_nbr]
,[id_vchr_line]
FROM [vwMP_VOL]) AS old
ON old.[Org] = inserted.Org
AND old.[id_vend] = inserted.id_vend
AND old.[id_org_orig] = inserted.id_org_orig
AND old.[id_vchr_nbr] = inserted.id_vchr_nbr
AND old.[id_vchr_line] = inserted.id_vchr_line
WHERE old.Org IS NULL;
END
Inserting new rows works fine, but all existing rows get updated with one set of values.
SELECT
text_vchr, count(*) as dups
FROM MP_VOL
group by text_vchr
order by count(*) desc
Results:
text_vchr dups
------------------------- -----
MEDIA MONITORING SERVICES 20897
1
Do I have to disable fastload in SSIS, or is there some other way to fix it?
(It's SQL Server 2005, so MERGE is not available)