Menyetel ulang urutan SQL Server 2012

13

Saya sedang dalam proses menguji dan mengisi tabel tertentu yang memanfaatkan SEQUENCEobjek. Dalam proses ini saya sedang menguji mengisi tabel dengan puluhan ribu garis insert (karena saya tidak terbiasa dengan cara memprogram ini). Masalah yang saya lihat dengan tabel khusus ini adalah ketika saya memulai tes populasi lain, angka SEQUENCEtersebut tidak direset kembali ke angka pertama yang saya inginkan (yaitu 1).

Ketika saya ingin menjalankan kembali pengujian baru saya menghapus tabel yang dimaksud kemudian jalankan yang berikut:

DROP SEQUENCE foo.fee;
GO

DROP SCHEMA foo;
GO

Ketika saya ingin menjalankan kembali tes, saya menjalankan perintah SCHEMA& berikut SEQUENCEini, yang dijalankan dalam urutan di bawah ini:

CREATE SCHEMA foo;
GO

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

GO

Saya kemudian membuat tabel:

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

Setelah selesai saya menjalankan perintah sisipkan 50.000 kali:

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

Sekarang sama sekali tidak ada masalah dengan data yang masuk ke dalam tabel. Tantangan yang saya temui adalah ketika saya menghapus tabel, jatuhkan skema dan urutan kemudian buat kembali tabel, urutan, dan skema pengambilan SEQUENCEdari nomor terakhir dalam inkarnasi database sebelumnya dan tidak diatur ulang ke satu.

Misalnya, jika nomor terakhir dalam urutan adalah mengatakan 634.534 nomor urutan berikutnya dalam tabel baru adalah 634.535.

Setelah menghapus tabel dan menjatuhkan skema dan urutan, saya menjalankan yang berikut untuk memverifikasi penghapusan urutan dan skema:

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
GO

SELECT * FROM sys.sequences
GO

Saya bingung mengapa ini terjadi. Apakah ada perintah lain yang saya lewatkan di sini yang akan membantu saya melokalisasi apa yang sebenarnya terjadi di sini?

Saya harus mencatat bahwa tabel ini milik database dengan 7 tabel lainnya semua menjalankan SEQUENCEperintah dengan benar.

Ini adalah instalasi SQL 2012 SP1 Enterprise Edition.

Techie Joe
sumber

Jawaban:

5

Menggunakan skrip Anda dengan sedikit perubahan:

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;

... Saya tidak dapat mereproduksi masalah pada SQL Server 2012 SP1 (build 3000) atau lebih tinggi.

Saya tidak dapat menemukan item Connect atau artikel KB yang menyebutkan skenario khusus ini (dan ada banyak SEQUENCEmasalah lain ). Itu bukan untuk mengatakan itu tidak ada pra-SP1 karena tidak semua perbaikan akhirnya didokumentasikan.

Paul White 9
sumber