相关疑难解决方法(0)

IDENTITY 列中出现意外空白

我正在尝试生成从 1 开始并以 1 递增的唯一采购订单编号。我使用此脚本创建了一个 PONumber 表:

CREATE TABLE [dbo].[PONumbers]
(
  [PONumberPK] [int] IDENTITY(1,1) NOT NULL,
  [NewPONo] [bit] NOT NULL,
  [DateInserted] [datetime] NOT NULL DEFAULT GETDATE(),
  CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC)    
);
Run Code Online (Sandbox Code Playgroud)

以及使用此脚本创建的存储过程:

CREATE PROCEDURE [dbo].[GetPONumber] 
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1);
    SELECT SCOPE_IDENTITY() AS PONumber;
END
Run Code Online (Sandbox Code Playgroud)

在创建时,这工作正常。当存储过程运行时,它从所需的数字开始并以 1 递增。

奇怪的是,如果我关闭或休眠我的计算机,那么下次运行该程序时,序列已提前了近 1000。

见下面的结果:

采购订单编号

你可以看到数字从 8 跃升到了 1002!

  • 为什么会这样?
  • 我如何确保不会像那样跳过数字?
  • 我所需要的只是让 SQL 生成以下数字:
    • a) 保证唯一。
    • b) 增加所需的数量。

我承认我不是 SQL 专家。我是否误解了 SCOPE_IDENTITY() 的作用?我应该使用不同的方法吗?我查看了 SQL 2012+ 中的序列,但微软表示默认情况下不能保证它们是唯一的。

sql-server identity sql-server-2012

19
推荐指数
1
解决办法
2万
查看次数

通过存储过程模拟 TSQL 序列

我需要创建一个模拟 TSQL 序列的存储过程。也就是说,它总是在每次调用时给出一个递增的不同整数值。此外,如果传入一个整数,如果从来没有更大的结果或可用的下一个最高整数,则它应该返回该值。不用说,可以有多个客户端同时调用此 SP。

给定一个包含 MetaKey varchar(max) 和 MeatValueLong bigInt 列的 MetaInfo 表。MetaKey 为“Internal-ID-Last”的行应该包含最后分配的最高值。我创建了以下存储过程:

CREATE PROCEDURE [dbo].[uspGetNextID]
(
  @inID bigInt 
)
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRANSACTION

    UPDATE MetaInfo WITH (ROWLOCK) 
      SET MetaValueLong = CASE 
                            WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1 
                            ELSE @inID+1
                          END 
    WHERE MetaKey = 'Internal-ID-Last'

    SELECT MetaValueLong 
    FROM MetaInfo
    WHERE MetaKey = 'Internal-ID-Last'

    COMMIT TRANSACTION 

END
Run Code Online (Sandbox Code Playgroud)

我的问题很简单,这个存储过程是否按预期工作(所有调用者都将被分配一个唯一的结果)?

sql-server-2008

17
推荐指数
1
解决办法
1万
查看次数

显式生成唯一 ID 的标识列或 UDF?

我正在争论是否最好PRIMARY KEY使用Identity Columns,我们使用显式生成唯一 id 的 UDF 。

  • 我在为身份栏争论。
  • 我的合作伙伴主张手动生成值,他声称
    • 通过将 UDF 放在另一个可以拥有 UDF 的桌子上
      • 锁定资源
      • 递增的ID表叫做一个字段ID_Value1
      • 将此用作全局唯一标识符
    • 或者id+1在插入时让表做一个
    • 在没有识别约束的服务器和/或环境之间移动数据更简单;从一个有数据的数据库移动到另一个类似的数据库,比如暂存或虚拟数据。对于非生产中的测试,我们可能希望将昨天的所有记录提取到暂存以进行测试。

哪个实现更有意义?

sql-server-2005 sql-server uniqueidentifier identity functions

11
推荐指数
3
解决办法
3063
查看次数

保证 SQL Server Identity Columns 两个连续的值以恒定增量不同?

我提出关于迪纳利序列的问题,在这里和关于Oracle全球表标识列的仿真另外一个问题在这里

我一直认为我可以相信身份值会不断增加。另一方面,我知道使用序列我永远无法确定它们中没有一些空白。

是时候适应序列中的差距,还是留在临时表中的标识列会更好?

sql-server sequence identity sql-server-2012 temporary-tables

6
推荐指数
1
解决办法
1442
查看次数