Restablecer una secuencia de SQL Server 2012


13

Estoy en el proceso de probar y completar una tabla específica que aprovecha el SEQUENCEobjeto. En este proceso, estoy probando llenar la tabla con decenas de miles de líneas de inserción (ya que no estoy familiarizado con cómo programar esto). El problema que estoy viendo con esta tabla específica es que cuando comienzo otra prueba de población, SEQUENCEno se restablece al primer número que quiero (que es 1).

Cuando deseo volver a ejecutar una nueva prueba, elimino la tabla en cuestión y luego ejecuto lo siguiente:

DROP SEQUENCE foo.fee;
GO

DROP SCHEMA foo;
GO

Cuando quiero volver a ejecutar la prueba de que ejecute el siguiente SCHEMAy SEQUENCEcomandos, que se disparan en el orden siguiente:

CREATE SCHEMA foo;
GO

CREATE SEQUENCE foo.fee
START WITH 1
INCREMENT BY 1
NO CYCLE
NO CACHE;

GO

Luego creo la tabla:

CREATE TABLE foo.sample_table_with_data
(order_number bigint PRIMARY KEY NOT NULL,
sample_column_one nvarchar(max) NULL,
sample_column_two nvarchar(max) NULL,
sample_column_three nvarchar(max) NULL)

GO

Una vez que se completa, ejecuto el siguiente comando de inserción 50,000 veces:

INSERT INTO [foo].[sample_table_with_data] 
(
    [order_number],
    [sample_column_one], 
    [sample_column_two], 
    [sample_column_three]
) 
VALUES 
(
    NEXT VALUE FOR foo.fee, 
    'Blah', 
    'Blah Blah', 
    'Blah Blah Blah'
)

Ahora no hay absolutamente ningún problema con la entrada de datos en la tabla. El desafío con el que me encuentro es que cuando elimino la tabla, suelto el esquema y la secuencia, luego vuelvo a crear la tabla, la secuencia y el esquema que SEQUENCErecoge del último número en la encarnación de la base de datos anterior y no se restablece a uno.

Por ejemplo, si el último número de la secuencia es, digamos, 634,534, el siguiente número de secuencia en la nueva tabla es 634,535.

Después de eliminar la tabla y soltar el esquema y la secuencia, ejecuto lo siguiente para verificar la eliminación de la secuencia y el esquema:

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
GO

SELECT * FROM sys.sequences
GO

Estoy perplejo de por qué esto está sucediendo. ¿Hay otro comando que me estoy perdiendo aquí que me ayudaría a localizar exactamente qué está pasando aquí?

Debo señalar que esta tabla pertenece a una base de datos con otras 7 tablas que ejecutan el SEQUENCEcomando correctamente.

Esta es una instalación de SQL 2012 SP1 Enterprise Edition.

Respuestas:



5

Usando su script con algunos pequeños cambios:

CREATE SCHEMA foo;
GO
CREATE SEQUENCE foo.fee
START WITH 1
INCREMENT BY 1
NO CYCLE
NO CACHE;
GO
CREATE TABLE foo.sample_table_with_data
(order_number bigint PRIMARY KEY NOT NULL,
sample_column_one nvarchar(max) NULL,
sample_column_two nvarchar(max) NULL,
sample_column_three nvarchar(max) NULL)
GO
SET NOCOUNT ON
GO
INSERT INTO [foo].[sample_table_with_data]
    ([order_number],[sample_column_one],[sample_column_two],[sample_column_three]) 
VALUES
    (NEXT VALUE FOR foo.fee,'Blah','Blah Blah','Blah Blah Blah')
GO 50000
SELECT
    MIN(order_number), 
    MAX(order_number)
FROM foo.sample_table_with_data AS stwd
GO
DROP SEQUENCE foo.fee;
GO
DROP TABLE foo.sample_table_with_data
GO
DROP SCHEMA foo;

... No puedo reproducir el problema en SQL Server 2012 SP1 (compilación 3000) o superior.

Tampoco puedo encontrar un elemento de Connect o un artículo de KB que mencione este escenario particular (y ha habido muchos otros SEQUENCEproblemas). Eso no quiere decir que no existía antes del SP1 porque no todas las soluciones terminan siendo documentadas.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.