Estou tentando gerar números de ordem de compra exclusivos que começam em 1 e incrementam em 1. Tenho uma tabela PONumber criada usando este script:
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)
);
E um procedimento armazenado criado usando este script:
CREATE PROCEDURE [dbo].[GetPONumber]
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1);
SELECT SCOPE_IDENTITY() AS PONumber;
END
No momento da criação, isso funciona bem. Quando o procedimento armazenado é executado, ele começa no número desejado e é incrementado em 1.
O estranho é que, se eu desligar ou hibernar meu computador, na próxima vez que o procedimento for executado, a sequência avançará quase 1.000.
Veja os resultados abaixo:
Você pode ver que o número saltou de 8 para 1002!
- Por que isso está acontecendo?
- Como posso garantir que os números não sejam ignorados assim?
- Tudo o que preciso é que o SQL gere números que sejam:
- a) Único garantido.
- b) incrementar pelo valor desejado.
Admito que não sou um especialista em SQL. Eu entendi mal o que SCOPE_IDENTITY() faz? Devo usar uma abordagem diferente? Pesquisei as sequências no SQL 2012+, mas a Microsoft diz que não há garantia de que sejam exclusivas por padrão.