การรีเซ็ตลำดับของ SQL Server 2012


13

ฉันกำลังอยู่ระหว่างการทดสอบและสร้างตารางเฉพาะที่ใช้ประโยชน์จากSEQUENCEวัตถุ ในกระบวนการนี้ฉันกำลังทดสอบการเติมตารางด้วยจำนวนบรรทัดการแทรกนับหมื่น (เนื่องจากฉันไม่คุ้นเคยกับวิธีการตั้งโปรแกรมนี้) ปัญหาที่ฉันเห็นด้วยตารางนี้คือเมื่อฉันเริ่มการทดสอบประชากรอื่นการSEQUENCEตั้งค่าไม่ได้กลับไปเป็นหมายเลขแรกที่ฉันต้องการ (ซึ่งคือ 1)

เมื่อฉันต้องการเรียกใช้การทดสอบใหม่อีกครั้งฉันจะลบตารางที่เป็นปัญหาแล้วจึงเรียกใช้สิ่งต่อไปนี้:

DROP SEQUENCE foo.fee;
GO

DROP SCHEMA foo;
GO

เมื่อฉันต้องการเรียกใช้การทดสอบอีกครั้งฉันใช้คำสั่งSCHEMA& SEQUENCEคำสั่งต่อไปนี้ซึ่งเรียกใช้ตามลำดับด้านล่าง:

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

เมื่อเสร็จแล้วฉันจะรันคำสั่ง insert ต่อไปนี้ 50,000 ครั้ง:

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

ตอนนี้ไม่มีปัญหากับการป้อนข้อมูลลงในตาราง ความท้าทายที่ฉันพบคือเมื่อฉันลบตารางปล่อย schema และลำดับจากนั้นสร้างตารางลำดับและ schema ที่SEQUENCEหยิบขึ้นมาจากหมายเลขสุดท้ายในชาติฐานข้อมูลก่อนหน้าและไม่รีเซ็ตกลับเป็นหนึ่ง

ตัวอย่างเช่นหากหมายเลขสุดท้ายในลำดับนั้นมีจำนวน 634,534 หมายเลขลำดับถัดไปในตารางใหม่คือ 634,535

หลังจากลบตารางและวางสคีมาและลำดับฉันรันต่อไปนี้เพื่อตรวจสอบการลบลำดับและสคีมา:

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
GO

SELECT * FROM sys.sequences
GO

ฉันนิ่งงันว่าทำไมสิ่งนี้จึงเกิดขึ้น มีคำสั่งอื่นที่ฉันหายไปที่นี่ซึ่งจะช่วยให้ฉัน จำกัด สิ่งที่เกิดขึ้นที่นี่?

ฉันควรทราบว่าตารางนี้เป็นของฐานข้อมูลที่มี 7 ตารางอื่น ๆ ทั้งหมดทำงานSEQUENCEคำสั่งอย่างถูกต้อง

นี่คือการติดตั้ง SQL 2012 SP1 Enterprise Edition

คำตอบ:



5

การใช้สคริปต์ของคุณด้วยการเปลี่ยนแปลงเล็กน้อย:

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;

... ฉันไม่สามารถสร้างปัญหาใน SQL Server 2012 SP1 (รุ่น 3000) ขึ้นไป

ฉันไม่พบรายการเชื่อมต่อหรือบทความ KB ที่กล่าวถึงสถานการณ์นี้โดยเฉพาะ (และมีSEQUENCEปัญหาอื่น ๆ อีกมากมาย) ไม่ได้หมายความว่าไม่ได้อยู่ใน pre-SP1 เนื่องจากการแก้ไขทั้งหมดไม่ได้ถูกบันทึกไว้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.