Published on

April 8, 2025

Генерация уникальных последовательных значений в SQL Server

В некоторых бизнес-сценариях может потребоваться создание уникального “идентификатора” для групп строк в базе данных SQL Server. Этот идентификатор может использоваться для логической блокировки строк от дальнейшей обработки и позволяет их обрабатывать группами с помощью автономной процедуры. В этой статье мы рассмотрим решение, которое не требует ручного обслуживания и использует встроенные функции SQL Server.

Решение заключается в использовании функции генерации значения идентификатора, предоставляемой SQL Server для столбца таблицы. Используя значение идентификатора, SQL Server может генерировать уникальное целочисленное значение, которое может использоваться для создания последовательного и уникального идентификатора для каждого шага обработки. Этот подход предлагает несколько преимуществ по сравнению с альтернативами, такими как использование функции NEWID, которая возвращает уникальное значение uniqueidentifier из 16 символов, с которым сложнее работать и которое не имеет последовательного номера.

Давайте рассмотрим код, иллюстрирующий это решение:


-- Создание таблицы для хранения уникальных последовательных значений
-- Эта таблица определяет единственный столбец идентификатора
if object_id('sequence') is not null
    drop table [sequence]
go

create table dbo.[sequence] 
(
    sequenceid int identity(1,1) not null
)
go

-- Эта процедура используется для генерации уникального значения
if object_id('get_next_sequence') is not null 
    drop procedure dbo.get_next_sequence
go

create procedure dbo.get_next_sequence @seqno int output
as
set nocount on

begin tran tran1

insert into dbo.[sequence] default values
rollback

select @seqno = scope_identity()
go

Вышеуказанный код создает таблицу с именем “sequence” с единственным столбцом идентификатора. Эта таблица используется исключительно для генерации уникального последовательного значения для другой обработки. В этой таблице не хранятся данные. Кроме того, создается хранимая процедура с именем “get_next_sequence”. Эта процедура отвечает за вставку новой строки в таблицу “sequence” и передачу сгенерированного значения идентификатора в качестве идентификатора вызывающему процессу.

Чтобы получить следующий последовательный номер, вы можете выполнить следующий код:


-- Пример вызова процедуры для получения следующего идентификатора
declare @seqno int
exec dbo.get_next_sequence @seqno output
select @seqno

Каждый раз при выполнении этого кода будет возвращено новое значение в качестве следующего последовательного идентификатора.

Важно отметить, что возвращаемое сгенерированное значение может использоваться для обновления следующего набора строк для обработки. Подход с использованием хранимой процедуры позволяет изолировать эту логику в одной точке ссылки. Хотя таблица “sequence” всегда пуста, вы можете просмотреть последний сгенерированный идентификатор с помощью команды DBCC CHECKIDENT.

Хотя транзакция с откатом реализована для предотвращения роста таблицы “sequence”, вы можете выбрать ее удаление, если оно не требуется для вашего конкретного сценария. В таких случаях рекомендуется запланировать задание для очистки записей или использовать DELETE вместо ROLLBACK. Однако важно отметить, что операция TRUNCATE на таблице “sequence” сбросит начальное значение идентификатора обратно на его начальное значение.

В заключение, используя функцию генерации значения идентификатора в SQL Server, вы можете легко генерировать уникальные последовательные значения для группировки и обработки строк в вашей базе данных. Этот подход устраняет необходимость в ручном обслуживании и позволяет эффективно обрабатывать данные логическим и организованным образом.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.