如何使用SEQUENCE只插入唯一的数字?

时间:2016-02-08 12:11:02

标签: sql-server tsql sql-server-2012

我正在使用托盘,它们的ID范围从10000000到15000000.每年循环几次,目前的解决方案是使用当前pallet_id的表格,其触发器重置为15000000回到10000000并且通常这不是问题,因为到了发生的时间,所有数字将再次自由。这是一个问题,

我一直在研究使用SEQUENCE而不是将这个额外的表与触发器一起使用。

我到目前为止提出的是:

sp_Counter_NextValue

CREATE SEQUENCE [Database].sp_Counter_NextValue
AS int
START WITH 10000000
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE

插入

INSERT INTO X_PALLETS (sp_Counter_NextValue, information)

当计数器达到最大值时,如果X_PALLETS中存在数字10000000,我将如何跳过数字?

1 个答案:

答案 0 :(得分:0)

这是最终的解决方案。

<强>序列

CREATE SEQUENCE [dbo].[SEQ_PALLET] 
    AS [bigint]
    START WITH 10010341
    INCREMENT BY 1
    MINVALUE 10000000
    MAXVALUE 15000000
    CYCLE 
    CACHE 
GO

CREATE SEQUENCE [dbo].[SEQ_PICK_PALLET] 
    AS [bigint]
    START WITH 5541980
    INCREMENT BY 1
    MINVALUE 1000000
    MAXVALUE 9999999
    CYCLE 
    CACHE 
GO

存储过程

ALTER PROCEDURE [dbo].[sp_Counter_NextValue]
    @name nvarchar(24)
AS
BEGIN
    SET NOCOUNT ON; 
    declare @value bigint

    IF @name = 'PALLET'
    BEGIN       
        SELECT @value = NEXT VALUE FOR SEQ_PALLET
    END
    ELSE IF @name = 'PICK_PALLET'
    BEGIN
        SELECT @value = NEXT VALUE FOR SEQ_PICK_PALLET
    END

    SELECT @value as VALUE
    RETURN @value
END