Réinitialisation d'une séquence SQL Server 2012


13

Je suis en train de tester et de remplir une table spécifique qui exploite l' SEQUENCEobjet. Dans ce processus, je teste le remplissage de la table avec des dizaines de milliers de lignes d'insertion (car je ne suis pas familier avec la façon de programmer cela). Le problème que je vois avec ce tableau spécifique est que lorsque je démarre un autre test de population, le SEQUENCEne revient pas au premier nombre souhaité (qui est 1).

Lorsque je souhaite relancer un nouveau test, je supprime la table en question, puis exécute ce qui suit:

DROP SEQUENCE foo.fee;
GO

DROP SCHEMA foo;
GO

Lorsque je veux relancer le test, j'exécute les commandes SCHEMA& suivantes SEQUENCE, qui sont déclenchées dans l'ordre ci-dessous:

CREATE SCHEMA foo;
GO

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

GO

Je crée ensuite la table:

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

Une fois cela terminé, j'exécute la commande d'insertion suivante 50 000 fois:

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'
)

Maintenant, il n'y a absolument aucun problème avec les données entrant dans la table. Le défi que je rencontre est que lorsque je supprime la table, je supprime le schéma et la séquence, puis je recrée la table, la séquence et le schéma SEQUENCErécupérés à partir du dernier numéro de la précédente incarnation de la base de données et non réinitialisé à un.

Par exemple, si le dernier numéro de la séquence est disons 634 534, le numéro de séquence suivant dans la nouvelle table est 634 535.

Après avoir supprimé la table et abandonné le schéma et la séquence, j'exécute ce qui suit pour vérifier la suppression de la séquence et du schéma:

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
GO

SELECT * FROM sys.sequences
GO

Je suis perplexe quant à la raison pour laquelle cela se produit. Y a-t-il une autre commande qui me manque ici qui pourrait m'aider à localiser exactement ce qui se passe ici?

Je dois noter que cette table appartient à une base de données avec 7 autres tables exécutant toutes la SEQUENCEcommande correctement.

Il s'agit d'une installation de SQL 2012 SP1 Enterprise Edition.

Réponses:



5

Utilisation de votre script avec quelques légères modifications:

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;

... Je ne peux pas reproduire le problème sur SQL Server 2012 SP1 (build 3000) ou supérieur.

Je ne trouve pas non plus un élément Connect ou un article de la base de connaissances mentionnant ce scénario particulier (et il y a eu beaucoup d'autres SEQUENCEproblèmes). Cela ne veut pas dire qu'il n'existait pas avant le SP1 car tous les correctifs ne sont pas documentés.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.