Сброс последовательности 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

После того, как это будет выполнено, я запускаю следующую команду вставки 50000 раз:

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

Теперь нет абсолютно никаких проблем с вводом данных в таблицу. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я удаляю таблицу, удаляю схему и последовательность, а затем воссоздаю таблицу, последовательность и схему, которые 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) или выше.

Я не могу найти элемент Connect или статью KB, в которой упоминается этот конкретный сценарий (и было много других SEQUENCEпроблем). Это не значит, что он не существовал до SP1, потому что не все исправления заканчиваются документированием.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.