Я намагаюся генерувати унікальні номери замовлень на купівлю, які починаються з 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)
);
І збережена процедура, створена за допомогою цього сценарію:
CREATE PROCEDURE [dbo].[GetPONumber]
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1);
SELECT SCOPE_IDENTITY() AS PONumber;
END
На момент створення це прекрасно працює. Коли збережена процедура запускається, вона починається з потрібного числа та з кроком на 1.
Дивна річ у тому, що якщо я вимкну або перезимував комп’ютер, то наступного разу, коли буде запущена процедура, послідовність просунулася майже на 1000.
Дивіться результати нижче:
Видно, що число підскочило з 8 до 1002!
- Чому це відбувається?
- Як зробити так, щоб цифри не пропускалися так?
- Все, що мені потрібно, це для SQL для генерації чисел, які є:
- а) Гарантована унікальність.
- б) приріст на потрібну суму.
Я визнаю, що я не експерт SQL. Чи я неправильно розумію, що робить SCOPE_IDENTITY ()? Чи варто використовувати інший підхід? Я роздивився послідовності в SQL 2012+, але Microsoft каже, що вони не гарантовано є унікальними за замовчуванням.