August 29, 2007 at 11:07 am
On looking at this again, James has a good point about an unique constraint on AA_Anno and Val_NumSpedizione. If you want to add this constraint then try an instead of trigger like the following:
SET QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
CREATE TRIGGER TR_I_GSP_Spedizione
ON dbo.GSP_Spedizione
INSTEAD OF INSERT
AS
DECLARE @s-2 TABLE
(
ID_Spedizione int IDENTITY NOT NULL
,AA_Anno smallint NOT NULL
,Val_NumSpedizione smallint NOT NULL
,ID_Mittente smallint NOT NULL
,Cod_UORichiedente varchar(6) COLLATE DATABASE_DEFAULT NOT NULL
,Des_ResponsabileRichiedente varchar(100) COLLATE DATABASE_DEFAULT NULL
,Dat_Inserimento datetime NOT NULL
,ID_TipoSpedizione tinyint NULL
,ID_TipoContenuto smallint NULL
,Des_Contenuto varchar(255) COLLATE DATABASE_DEFAULT NULL
,Txt_Note text COLLATE DATABASE_DEFAULT NULL
,ID_Status tinyint NOT NULL
,Cod_MatricolaGestore char(6) COLLATE DATABASE_DEFAULT NULL
,Dat_PresaInCarico datetime NULL
,Loc_MailRichiedente varchar(100) COLLATE DATABASE_DEFAULT NULL
)
INSERT INTO @s-2
(
AA_Anno
,Val_NumSpedizione
,ID_Mittente
,Cod_UORichiedente
,Des_ResponsabileRichiedente
,Dat_Inserimento
,ID_TipoSpedizione
,ID_TipoContenuto
,Des_Contenuto
,Txt_Note
,ID_Status
,Cod_MatricolaGestore
,Dat_PresaInCarico
,Loc_MailRichiedente
)
SELECT AA_Anno
,Val_NumSpedizione
,ID_Mittente
,Cod_UORichiedente
,Des_ResponsabileRichiedente
,Dat_Inserimento
,ID_TipoSpedizione
,ID_TipoContenuto
,Des_Contenuto
,Txt_Note
,ID_Status
,Cod_MatricolaGestore
,Dat_PresaInCarico
,Loc_MailRichiedente
FROM inserted
DECLARE @I TABLE
(
ID_Spedizione int NOT NULL
,AA_Anno smallint NOT NULL
,RowID int IDENTITY NOT NULL
)
INSERT INTO @I (ID_Spedizione, AA_Anno)
SELECT ID_Spedizione, AA_Anno
FROM @s-2
WHERE ISNULL(Val_NumSpedizione, 0) = 0
ORDER BY AA_Anno, ID_Spedizione
OPTION (MAXDOP 1)
UPDATE S
SET Val_NumSpedizione = I.RowID - D1.MinID + 1 + D2.MaxVal
FROM @s-2 S
JOIN @I I
ON S.ID_Spedizione = I.ID_Spedizione
JOIN (
SELECT S2.AA_Anno
,ISNULL(MAX(S2.Val_NumSpedizione), 0) AS MaxVal
FROM dbo.GSP_Spedizione S2 WITH (UPDLOCK)
GROUP BY S2.AA_Anno
) D2
ON S.AA_Anno = D2.AA_Anno
JOIN (
SELECT I1.AA_Anno
,MIN(I1.RowID) AS MinID
FROM @I I1
GROUP BY I1.AA_Anno
) D1
ON S.AA_Anno = D1.AA_Anno
INSERT INTO dbo.GSP_Spedizione
(
AA_Anno
,Val_NumSpedizione
,ID_Mittente
,Cod_UORichiedente
,Des_ResponsabileRichiedente
,Dat_Inserimento
,ID_TipoSpedizione
,ID_TipoContenuto
,Des_Contenuto
,Txt_Note
,ID_Status
,Cod_MatricolaGestore
,Dat_PresaInCarico
,Loc_MailRichiedente
)
SELECT AA_Anno
,Val_NumSpedizione
,ID_Mittente
,Cod_UORichiedente
,Des_ResponsabileRichiedente
,Dat_Inserimento
,ID_TipoSpedizione
,ID_TipoContenuto
,Des_Contenuto
,Txt_Note
,ID_Status
,Cod_MatricolaGestore
,Dat_PresaInCarico
,Loc_MailRichiedente
FROM @s-2
GO
August 29, 2007 at 12:39 pm
Mmm, if I'll have to put this constraint I'll remember of your solution... Till now the constraint is not important. Tnx
August 29, 2007 at 3:50 pm
A word of advice: if performance is important you may want to rethink this solution.
* Noel
August 29, 2007 at 4:05 pm
Till now (and I think also in the future) performance is not so important, but if you have another solution, faster, it's welcome.
Can you explain me where's performance problems in the solution proporsed??
Viewing 4 posts - 16 through 18 (of 18 total)
You must be logged in to reply to this topic. Login to reply