Sequence of number in a year without an auxiliary table

  • 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

     

  • Mmm, if I'll have to put this constraint I'll remember of your solution... Till now the constraint is not important. Tnx

  • A word of advice: if performance is important you may want to rethink this solution.


    * Noel

  • 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