Estou tentando gerar números únicos de pedidos que começam em 1 e aumentam 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 inicia no número desejado e aumenta em 1.
O estranho é que, se eu desligar ou hibernar o computador, na próxima vez em que o procedimento for executado, a sequência avançará quase 1000.
Veja os resultados abaixo:
Você pode ver que o número saltou de 8 para 1002!
- Por que isso está acontecendo?
- Como 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) incremento na quantidade desejada.
Admito que não sou especialista em SQL. Entendo mal o que SCOPE_IDENTITY () faz? Devo estar usando uma abordagem diferente? Examinei as seqüências no SQL 2012+, mas a Microsoft diz que elas não são garantidas como únicas por padrão.
fonte
Este é um problema do SQL Server. Tudo o que você pode fazer é reenviar a coluna.
exclua as entradas com o ID da coluna incorreto. Reseed a identidade da coluna. E então a próxima entrada possui o ID adequado.
Reseed Identity usando o seguinte comando sql:
DBCC CHECKIDENT ('YOUR_TABLE_NAME', RESEED, 9)
- 9 é o último ID corretofonte