Сброс последовательности 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, потому что не все исправления заканчиваются документированием.

Пол Уайт 9
источник