Хранимая процедура получения уникальных номеров - PullRequest
0 голосов
/ 30 марта 2020

Итак, у меня есть две хранимые процедуры на моем SQL сервере. Один выбирает номер из моей таблицы, а другой увеличивает число выбранных ячеек на единицу.

В настоящее время в SP есть только один вызывающий абонент, но в будущем их может быть больше.

Итак Мне интересно, есть ли у меня несколько абонентов (все с одной и той же учетной записью) для SP, могу ли я получить один и тот же номер несколько раз?

Эта тема заставляет меня поверить, что это это возможно, но не потому, что я также редактирую данные, и сервер не будет пытаться редактировать данные из нескольких вызовов.

Мой текущий SP:

dbo.GetNextNumber

USE [NumberProvider]
GO
/****** Object:  StoredProcedure [dbo].[GetNextNumber]    Script Date: 30.3.2020 08:58:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
    ALTER PROCEDURE [dbo].[GetNextNumber]  
        -- Add the parameters for the stored procedure here  
        @SchemeId int 

    AS  
    BEGIN  
        -- SET NOCOUNT ON added to prevent extra result sets from  
        -- interfering with SELECT statements.  
        SET NOCOUNT ON; 

        -- Select next number.
        SELECT NextNum
        FROM dbo.NumberingSchemes
        WHERE Id = @SchemeId

        -- Increase number by one.
        EXEC dbo.UpdateNumber @SchemeId
    END  

dbo.UpdateNumber

USE [NumberProvider]
GO
/****** Object:  StoredProcedure [dbo].[UpdateNumber]    Script Date: 30.3.2020 09:13:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[UpdateNumber]  
    -- Add the parameters for the stored procedure here  
    @SchemeId int  

AS  
BEGIN
    SET NOCOUNT ON;

    -- Update number
    UPDATE dbo.NumberingSchemes
    SET NextNum = NextNum + 1
    WHERE Id = @SchemeId
END

Итак, я думаю, что-то вроде этого лучше?

USE [NumberProvider]
GO
/****** Object:  StoredProcedure [dbo].[UpdateNumber]    Script Date:
27.3.2020 21:10:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[UpdateNumber]
    -- Add the parameters for the stored procedure here
    @SchemeId int

AS
BEGIN
BEGIN TRANSACTION;
  SAVE TRANSACTION MySavePoint;
    SET NOCOUNT ON;

BEGIN TRY
    UPDATE dbo.NumberingSchemes
    SET NextNum = NextNum + 1
    WHERE Id = @SchemeId



     SELECT NextNum
     FROM dbo.NumberingSchemes
     WHERE Id = @SchemeId;

        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
        BEGIN
            ROLLBACK TRANSACTION MySavePoint; -- rollback to MySavePoint
        END
    END CATCH
END

Редактировать 1:

Чтобы уточнить, Я использую это для создания схем нумерации, которые внешние приложения используют для распределения уникальных номеров. Мне нужно только отслеживать следующий номер, который будет дан.

Это мой дизайн таблицы, и мне может понадобиться добавить другие схемы в таблицу.

Таблица Дизайн

...