Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用序列只插入唯一的数字?_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

Sql server 如何使用序列只插入唯一的数字?

Sql server 如何使用序列只插入唯一的数字?,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我正在使用托盘,它们的ID从10000000到15000000不等。这种方法每年循环几次,目前的解决方案是使用一个带有当前托盘id的表,该表带有一个触发器,该触发器将在15000000重置回10000000,通常这不是一个问题,因为在发生这种情况时,所有数字都将再次可用。这现在是一个问题,也是一个问题 我一直在考虑使用SEQUENCE,而不是将这个额外的表与触发器一起使用 到目前为止,我得出的结论是: sp\u计数器下一个值 CREATE SEQUENCE [Database].sp_Count

我正在使用托盘,它们的ID从10000000到15000000不等。这种方法每年循环几次,目前的解决方案是使用一个带有当前
托盘id
的表,该表带有一个触发器,该触发器将在15000000重置回10000000,通常这不是一个问题,因为在发生这种情况时,所有数字都将再次可用。这现在是一个问题,也是一个问题

我一直在考虑使用
SEQUENCE
,而不是将这个额外的表与触发器一起使用

到目前为止,我得出的结论是:

sp\u计数器下一个值

CREATE SEQUENCE [Database].sp_Counter_NextValue
AS int
START WITH 10000000
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE
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
插入

INSERT INTO X_PALLETS (sp_Counter_NextValue, information)

例如,当计数器达到其最大值时,X_托盘中存在10000000个数字时,我如何跳过该数字?

这是最终的解决方案

序列

CREATE SEQUENCE [Database].sp_Counter_NextValue
AS int
START WITH 10000000
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE
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
存储过程

CREATE SEQUENCE [Database].sp_Counter_NextValue
AS int
START WITH 10000000
INCREMENT BY 1
MINVALUE 10000000
MAXVALUE 15000000
CYCLE
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

我不认为你可以用序列来做这件事。您可以定义
唯一
约束,并导致
插入失败,然后重试,直到成功。或者,您可以使用一个触发器来递增序列直到成功,但我认为您不能自动执行此操作。@GordonLinoff我很担心这一点。如果您使用
IDENTITY
但试图插入现有ID,或者将您的标识种子改为在现有值之前启动,您也会遇到同样的问题。为什么不为序列使用BIGINT并在任何现有值之后开始?X_托盘是否只包含活动记录,即托盘ID在处理后从表中删除?@目标数据是。