Последовательность строится средствами конструктора типа sql

Обновлено: 25.04.2024

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

Последовательность создается независимо от таблиц с помощью инструкции CREATE SEQUENCE . Параметры позволяют управлять приращением, максимальным и минимальным значением, начальной точкой, возможностью автоматического перезапуска и кэшированием для повышения производительности. Сведения о параметрах см. в разделе CREATE SEQUENCE.

В отличие от значений столбцов идентификаторов, которые создаются при вставке строк, приложение может получить следующий порядковый номер до вставки строки, вызвав функцию NEXT VALUE FOR . Порядковый номер выделяется, когда вызывается функция NEXT VALUE FOR, даже если номер так и не вставляется в таблицу. Функцию NEXT VALUE FOR можно использовать в качестве значения по умолчанию для столбца в определении таблицы. Сразу получить диапазон порядковых номеров можно с помощью процедуры sp_sequence_get_range .

Последовательность может быть определена с любым типом данных integer. Если тип данных не указан, по умолчанию для последовательности используется тип bigint.

Использование последовательностей

Последовательности используются вместо столбцов идентификаторов в следующих сценариях.

Приложению требуется номер до выполнения вставки в таблицу.

Приложению требуется единая нумерация для нескольких таблиц или нескольких столбцов в таблице.

Приложение должно перезапускать последовательность номеров по достижении определенного номера. Например, после назначения значений от 1 до 10 приложение вновь начинает назначать значения от 1 до 10.

Приложению необходимо сортировать значения последовательности по другому полю. Функция NEXT VALUE FOR может применять предложение OVER к вызову функции. Предложение OVER гарантирует, что возвращаемые значения создаются в порядке, указанном предложением ORDER BY в предложении OVER.

Приложению требуется одновременно назначать несколько номеров. Например, приложению требуется зарезервировать пять порядковых номеров. Запрос значений идентификаторов может вызвать пропуски в последовательности, если другие процессы одновременно запросили номера. Вызов процедуры sp_sequence_get_range может получить несколько номеров в последовательности сразу.

Необходимо изменить спецификацию последовательности, например значение приращения.

Ограничения

В отличие от столбцов идентификаторов, значения которых нельзя изменять, значения последовательностей не защищаются автоматически после вставки в таблицу. Чтобы запретить изменение значений последовательности, используйте в таблице триггер Update для отката изменений.

Уникальность значений последовательности не соблюдается автоматически. Значения последовательностей изначально предусматривают многократное использование. Если значения последовательности в таблице должны быть уникальными, создайте для столбца уникальный индекс. Если значения последовательности должны быть уникальными в пределах группы таблиц, создайте триггеры для исключения повторов, вызываемых инструкциями обновлений или циклической сменой порядковых номеров.

Объект последовательности создает номера в соответствии с определением, однако он не контролирует использование этих номеров. В порядковых номерах, вставляемых в таблицу, могут возникать промежутки в случае отката транзакции, если объект последовательности совместно используется несколькими таблицами или если порядковые номера выделяются, но не используются в таблицах. Если создание производилось с параметром CACHE, то непредвиденное завершение (например, сбой питания) может привести к потере последовательных номеров в кэше.

Если в одной инструкции Transact-SQL есть несколько экземпляров функции NEXT VALUE FOR, то все эти экземпляры возвращают одно и то же значение для заданной строки, обработанной инструкцией Transact-SQL. Такое поведение согласуется со стандартом ANSI.

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

Типичные случаи использования

Чтобы создать целочисленный порядковый номер с приращением 1, меняющийся от -2 147 483 648 до 2 147 483 647, используйте следующую инструкцию.

Чтобы создать целочисленный порядковый номер, аналогичный столбцу идентификаторов с приращением 1, меняющемуся от 1 до 2 147 483 647, используйте следующую инструкцию.

Управление последовательностями

Чтобы получить сведения о последовательностях, запросите представление sys.sequences.

Примеры

A. Использование порядкового номера в одной таблице

В следующем примере создается схема с именем Test, таблица с именем Orders и последовательность с именем CountBy1, а затем строки вставляются в таблицу с помощью функции NEXT VALUE FOR.

OrderID Name Qty

Б. Вызов NEXT VALUE FOR до вставки строки

В следующем примере с помощью таблицы Orders , созданной в примере А, объявляется переменная с именем @nextID , а затем с помощью функции NEXT VALUE FOR этой переменной присваивается следующий доступный порядковый номер. Предполагается, что в приложении выполняется некоторая обработка заказа, например заказчику сообщается номер OrderID потенциального заказа, а затем проводится проверка заказа. Независимо от времени, затрачиваемого на такую обработку, и от числа других заказов, добавляемых во время обработки, исходный номер сохраняется для использования в этом соединении. Наконец, инструкция INSERT добавляет заказ в таблицу Orders .

В. Использование порядкового номера в нескольких таблицах

В этом примере предполагается, что процесс мониторинга производственной линии получает уведомления о событиях, происходящих в цеху. Каждое событие получает уникальный, монотонно возрастающий номер EventID . Все события используют один порядковый номер EventID , и поэтому отчеты, где объединяются все события, могут однозначно определить каждое событие. Данные событий хранятся в трех различных таблицах в зависимости от типа события. В примере кода создается схема с именем Audit , последовательность с именем EventCounter и три таблицы, каждая из которых использует последовательность EventCounter в качестве значения по умолчанию. Затем в примере добавляются строки в три таблицы и запрашиваются результаты.

EventID EventTime Description

1 2009-11-02 15:00:51.157 Start

2 2009-11-02 15:00:51.160 Start

3 2009-11-02 15:00:51.167 Clean room temperature 18 degrees C.

4 2009-11-02 15:00:51.167 Spin rate threshold exceeded.

5 2009-11-02 15:00:51.173 Feeder jam

6 2009-11-02 15:00:51.177 Stop

7 2009-11-02 15:00:51.180 Central feed in bypass mode.

Г. Создание повторяющихся порядковых номеров в результирующем наборе

В следующем примере показаны две возможности работы с порядковыми номерами: циклическое повторение и использование NEXT VALUE FOR в инструкции SELECT.

Д. Создание порядковых номеров для результирующего набора с помощью предложения OVER

В следующем примере предложение OVER используется для сортировки результирующего набора по столбцу Name перед добавлением столбца с порядковым номером.

Е. Сброс порядкового номера

В примере Д обработаны первые 79 порядковых номеров Samples.IDLabel . (В используемой версии AdventureWorks2012 может возвращаться другое число результатов.) Чтобы обработать следующие 79 порядковых номеров (от 80 до 158), выполните следующий код.

Выполните следующую инструкцию, чтобы перезапустить последовательность Samples.IDLabel

Снова выполните инструкцию SELECT, чтобы убедиться, что последовательность Samples.IDLabel перезапущена с номера 1.

Ж. Перевод таблицы с идентификаторов на последовательность

В следующем примере создается схема и таблица, содержащая три строки. Затем в примере добавляется новый столбец и удаляется старый столбец.

Инструкции Transact-SQL, которые используются SELECT * , будут получать новый столбец в качестве последнего столбца вместо первого столбца. Если такая обработка нежелательна, необходимо создать новую таблицу, переместить в нее данные, а затем повторно создать разрешения для новой таблицы.

Создает объект последовательности и указывает его свойства. Последовательность представляет собой определяемый пользователем объект, привязанный к схеме, который формирует последовательность числовых значений в соответствии со спецификацией, с которой эта последовательность создавалась. Последовательность числовых значений формируется в возрастающем или убывающем порядке с заданным интервалом; можно настроить перезапуск (зацикливание) последовательности, когда она исчерпана. В отличие от столбцов идентификаторов последовательности не связаны с конкретными таблицами. Приложение обращается к объекту последовательности, чтобы получить следующее значение. Приложения управляют связями между последовательностями и таблицами. Пользовательские приложения могут ссылаться на объект последовательности и распределять значения между несколькими строками и таблицами.

В отличие от значений столбцов идентификаторов, которые создаются при вставке строк, приложение может получить следующий порядковый номер без вставки строки, вызвав функцию NEXT VALUE FOR. Получить несколько значений из последовательности за один раз можно с помощью функции sp_sequence_get_range .

Сведения и сценарии использования функций CREATE SEQUENCE и NEXT VALUE FOR см. в разделе Порядковые номера.

Синтаксис

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

sequence_name
Указывает уникальное имя, под которым последовательность известна в базе данных. Тип sysname.

[ built_in_integer_type | user-defined_integer_type
Последовательность может быть определена с любым целочисленным типом. Допускаются следующие типы.

  • tinyint — от 0 до 255
  • smallint — от –32 768 до 32 767
  • int — от –2 147 483 648 до 2 147 483 647
  • bigint — от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
  • decimal или numeric с масштабом 0.
  • Любой определяемый пользователем тип данных (псевдоним типа), основанный на одном из допустимых типов.

Если тип данных не указан, то по умолчанию используется тип bigint.

START WITH
Первое значение, возвращаемое объектом последовательности. Значение START должно быть не больше максимального и не меньше минимального значения объекта последовательности. По умолчанию начальным значением для нового объекта последовательности служит минимальное значение для объекта возрастающей последовательности и максимальное — для объекта убывающей.

INCREMENT BY
Значение, на которое увеличивается (или уменьшается, если оно отрицательное) значение объекта последовательности при каждом вызове функции NEXT VALUE FOR. Если значение приращения отрицательно, то объект последовательности убывает, в противном случае — возрастает. Приращение не может быть равно 0. По умолчанию для нового объекта последовательности используется приращение 1.

[ MINVALUE | NO MINVALUE ]
Указывает граничные значения для объекта последовательности. По умолчанию минимальным значением для нового объекта последовательности служит минимальное значение для типа данных объекта последовательности. Для типа данных tinyint это ноль, для всех остальных типов данных — отрицательное число.

[ MAXVALUE | NO MAXVALUE
Указывает граничные значения для объекта последовательности. По умолчанию максимальным значением для нового объекта последовательности служит максимальное значение для типа данных объекта последовательности.

[ CYCLE | NO CYCLE ]
Свойство, которое указывает, перезапускается объект последовательности с минимального значения (или максимального для объектов убывающих последовательностей) или вызывает исключение, когда достигнуто максимальное (или максимальное) значение. По умолчанию для новых объектов последовательности используется параметр цикличности NO CYCLE.

Циклическое повторение последовательности начинается не с начального, а с минимального или максимального значения.

[ CACHE [ ] | NO CACHE ]
Повышает производительность для приложений, использующих объекты последовательностей, сводя к минимуму число операций дискового ввода-вывода, которые требуются для создания порядковых номеров. По умолчанию имеет значение CACHE.

Например, если выбран размер кэша 50, то SQL Server не кэширует 50 отдельных значений. Кэшируется только текущее значение и число значений, оставшихся в кэше. Это значит, что объем памяти для хранения кэша всегда равен размеру двух экземпляров типа данных объекта последовательности.

Если параметр кэширования задан без указания размера кэша, то размер выбирается компонентом Database Engine. Однако пользователям не следует полагаться на предсказуемость выбора. Корпорация Майкрософт может изменить этот метод вычисления размера кэша без предварительного уведомления.

Если создание проводилось с параметром CACHE, то непредвиденное завершение работы (например, сбой электропитания) может привести к потере порядковых номеров, оставшихся в кэше.

Общие замечания

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

Управление кэшем

Для повышения производительности SQL Server заранее выделяет количество порядковых номеров, указанное в аргументе CACHE.

Например, новая последовательность создается с начальным значением 1 и размером кэша 15. Когда требуется первое значения, из памяти становятся доступными значения с 1 по 15. Последнее кэшированное значение (15) записывается в системные таблицы на диск. Когда используются все 15 номеров, то следующий запрос (для номера 16) вызывает повторное выделение кэша. Новое последнее кэшированное значение (30) записывается в системные таблицы.

Если ядро СУБД останавливается после использования 22 номеров, то следующий порядковый номер, ожидающий в памяти (23), записывается в системные таблицы, заменяя ранее хранившийся номер.

После перезапуска SQL Server, когда требуется порядковый номер, считывается начальный номер из системных таблиц (23). В память выделяется кэш размером в 15 номеров (23–38), а следующий номер, не попавший в кэш (39), записывается в системные таблицы.

Если ядро СУБД непредвиденно завершает работу (например, из-за сбоя электропитания), то последовательность перезапускается с номера, считываемого из системных таблиц (39). Все порядковые номера, выделенные в память (но не запрошенные пользователем или приложением), теряются. При такой обработке возможны пропуски в номерах, однако гарантируется, что одно значение ни в коем случае не будет дважды назначено одному объекту последовательности, если для нее не задан параметр CYCLE или не выполнен перезапуск вручную.

Кэш хранится в памяти путем отслеживания текущего значения (последнего назначенного) и количества значений, оставшихся в кэше. Таким образом, объем памяти, используемый для кэша, всегда равен размеру двух экземпляров типа данных объекта последовательности.

Если установить аргумент кэша в значение NO CACHE, то текущее значение последовательности будет записываться в системные таблицы при каждом использовании последовательности. Это может снизить производительность за счет увеличения числа обращений к диску, но снижает вероятность нежелательных пропусков номеров. Пропуски по-прежнему возможны, если номера запрашиваются с помощью функций NEXT VALUE FOR или sp_sequence_get_range, однако это означает, что пропущенные номера не используются либо используются в незафиксированных транзакциях.

Если в объекте последовательности используется параметр CACHE, то при перезапуске объекта последовательности или изменении свойств INCREMENT, CYCLE, MINVALUE, MAXVALUE или размера кэша кэш записывается в системные таблицы до выполнения изменения. Затем кэш перезагружается, начиная с текущего значения (номера не пропускаются). Изменение размера кэша вступает в силу немедленно.

Параметр CACHE при наличии кэшированных значений

Следующая процедура выполняется каждый раз, когда в объекте последовательности запрашивается создание следующего значения для параметра CACHE, если в кэше в памяти для объекта последовательности доступны неиспользованные значения.

Вычисляется следующее значение для объекта последовательности.

Новое текущее значение для объекта последовательности обновляется в памяти.

Вычисленное значение возвращается к вызывающей инструкции.

Параметр CACHE при пустом кэше

Следующая процедура выполняется каждый раз, когда в объекте последовательности запрашивается создание следующего значения для параметра CACHE, если кэш пуст.

Вычисляется следующее значение для объекта последовательности.

Вычисляется последнее значение для нового кэша.

Строка системной таблицы для объекта последовательности блокируется, а значение, вычисленное на шаге 2 (последнее значение), записывается в системную таблицу. Создается событие Xevent cache-exhausted, чтобы сообщить пользователю о новом сохраненном значении.

Параметр NO CACHE

Следующая процедура выполняется каждый раз, когда в объекте последовательности запрашивается создание следующего значения для параметра NO CACHE.

Вычисляется следующее значение для объекта последовательности.

Новое текущее значение для объекта последовательности записывается в системную таблицу.

Вычисленное значение возвращается к вызывающей инструкции.

Метаданные

Чтобы получить сведения о последовательностях, запросите представление sys.sequences.

Безопасность

Разрешения

Необходимо разрешение CREATE SEQUENCE, ALTERили CONTROL для схемы SCHEMA.

Члены предопределенных ролей базы данных db_owner и db_ddladmin могут создавать, изменять и удалять объекты последовательности.

Члены предопределенных ролей базы данных db_owner и db_datawriter могут обновлять объекты последовательности, вызывая создание номеров.

В следующем примере пользователю AdventureWorks\Larry предоставляется разрешение на создание последовательностей в схеме Test.

Владение объектом последовательности может быть передано с помощью инструкции ALTER AUTHORIZATION.

Если в последовательности используется определяемый пользователем тип данных, то создатель последовательности должен иметь разрешение REFERENCES для этого типа.

Аудит

Для аудита инструкции CREATE SEQUENCE отслеживайте SCHEMA_OBJECT_CHANGE_GROUP.

Примеры

Примеры создания последовательностей и использования функции NEXT VALUE FOR для формирования порядковых номеров см. в разделе Порядковые номера.

В большинстве из следующих примеров объекты последовательности создаются в схеме с именем Test.

Чтобы создать схему Test, выполните следующую инструкцию.

A. Создание последовательности, увеличивающейся на 1

В следующем примере пользователь Thierry создает последовательность с именем CountBy1, которая увеличивается на единицу при каждом использовании.

Б. Создание последовательности, уменьшающейся на 1

В следующем примере отсчет начинается с 0 и идет по отрицательным числам, уменьшаясь на единицу при каждом использовании.

В. Создание последовательности, увеличивающейся на 5

В следующем примере создается последовательность, которая увеличивается на 5 при каждом обращении.

Г. Создание последовательности, начинающейся с заданного числа

После импорта таблицы Thierry замечает, что максимальный номер идентификатора составляет 24 328. Thierry требуется последовательность, которая будет создавать номера, начиная с 24 329. В следующем коде создается последовательность, начинающаяся с 24 329 и увеличивающаяся на 1.

Д. Создание последовательности со значениями по умолчанию

В следующем примере создается последовательность со значениями по умолчанию.

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

Частичный перечень выходных данных демонстрирует значения по умолчанию.

Выходные данные Значение по умолчанию
start_value -9223372036854775808
increment 1
mimimum_value -9223372036854775808
maximum_value 9223372036854775807
is_cycling 0
is_cached 1
current_value -9223372036854775808

Е. Создание последовательности с заданным типом данных

В следующем примере создается последовательность с типом данных smallint и диапазоном значений от –32 768 до 32 767.

Ж. Создание последовательности с использованием всех аргументов

В следующем примере создается последовательность с именем DecSeq, использующая тип данных decimal и диапазон от 0 до 255. Последовательность начинается со 125 и увеличивается на 25 при каждом создании номера. Поскольку для последовательности настроено циклическое повторение при превышении максимального значения 200, она перезапускается с минимального значения 100.

Чтобы просмотреть первое значение, выполните следующую инструкцию. Параметр START WITH равен 125.

Выполните инструкцию еще три раза, чтобы вернуть значения 150, 175 и 200.

Снова выполните инструкции, чтобы увидеть, как начальное значение вернется к значению параметра MINVALUE , равного 100.

Выполните следующий код, чтобы подтвердить размер кэша и показать текущее значение.

Создает объект последовательности и указывает его свойства. Последовательность представляет собой определяемый пользователем объект, привязанный к схеме, который формирует последовательность числовых значений в соответствии со спецификацией, с которой эта последовательность создавалась. Последовательность числовых значений формируется в возрастающем или убывающем порядке с заданным интервалом; можно настроить перезапуск (зацикливание) последовательности, когда она исчерпана. В отличие от столбцов идентификаторов последовательности не связаны с конкретными таблицами. Приложение обращается к объекту последовательности, чтобы получить следующее значение. Приложения управляют связями между последовательностями и таблицами. Пользовательские приложения могут ссылаться на объект последовательности и распределять значения между несколькими строками и таблицами.

В отличие от значений столбцов идентификаторов, которые создаются во время вставки, приложение может получить следующий порядковый номер без вставки строки, вызвав функцию NEXT VALUE FOR. Получить несколько значений из последовательности за один раз можно с помощью функции sp_sequence_get_range .

Сведения и сценарии использования функций CREATE SEQUENCE и NEXT VALUE FOR см. в разделе Порядковые номера.

Доступ к этой странице можно получить двумя способами: щелкнуть правой кнопкой мыши Последовательности в обозревателе объектов и выбрать Создать последовательностьили щелкнуть правой кнопкой мыши существующую последовательность и выбрать Свойства. Если щелкнуть правой кнопкой мыши существующую последовательность и выбрать пункт Свойства, параметры будут недоступны для редактирования. Чтобы изменить параметры последовательности, используйте инструкцию ALTER SEQUENCE (Transact-SQL) или удалите и повторно создайте объект последовательности.

Параметры

Имя последовательности
Введите здесь имя последовательности.

Схема последовательности
Задайте схему, которой будет принадлежать эта последовательность.

Data type
Последовательность может быть определена с любым целочисленным типом. В том числе:

decimal или numeric с масштабом 0.

Любой определяемый пользователем тип данных (псевдоним типа), основанный на одном из этих типов.

Точность
Для типов данных decimal и numeric необходимо указать точность. (Масштаб всегда равен 0.)

Начать со значения
Первое значение, возвращаемое объектом последовательности. Значение START должно быть не больше максимального и не меньше минимального значения объекта последовательности. По умолчанию начальным значением для нового объекта последовательности служит минимальное значение для объекта возрастающей последовательности и максимальное — для объекта убывающей.

Приращение
Значение, на которое увеличивается (или уменьшается, если оно отрицательное) значение объекта последовательности при каждом вызове функции NEXT VALUE FOR . Если значение приращения отрицательно, то объект последовательности изменяется по убыванию, в противном случае — по возрастанию. Приращение не может быть равно 0.

Минимальное значение
Указывает граничные значения для объекта последовательности. По умолчанию минимальным значением для нового объекта последовательности служит минимальное значение для типа данных объекта последовательности. Для типа данных tinyint это ноль, для всех остальных типов данных — отрицательное число.

Максимальное значение
Указывает граничные значения для объекта последовательности. По умолчанию максимальным значением для нового объекта последовательности служит максимальное значение для типа данных объекта последовательности.

Циклическое повторение последовательности при достижении предела
Установите, чтобы объект последовательности начинал отсчет сначала с минимального значения (или максимального для убывающих объектов последовательности) при превышении минимального или максимального значения.

Циклическое повторение начинается не с начального, а с минимального/максимального значения.

Параметры кэша
Создание кэша значений последовательности позволяет повысить производительность приложений, использующих объекты последовательности, за счет сведения к минимуму числа дисковых операций ввода-вывода, необходимых для создания чисел последовательности.

Размер кэша по умолчанию — ядро СУБД выберет размер, однако пользователи не должны полагаться на то, что выбор согласован. Корпорация Майкрософт может изменить этот метод вычисления размера кэша без предварительного уведомления.

Нет кэша . SQL Server не будет кэшировать порядковые номера.

Кэш с размером — SQL Server кэширует значения последовательности. SQL Server отслеживает текущее значение и количество значений, оставшихся в кэше. Таким образом, объем памяти для хранения кэша всегда равен объему двух экземпляров типа данных объекта последовательности.

Если создание производилось с параметром CACHE, то непредвиденное завершение (например, сбой питания) может привести к потере последовательных номеров в кэше.

Дополнительные сведения о параметрах создания последовательности см. в разделе CREATE SEQUENCE (Transact-SQL).

Разрешения

Необходимо разрешение CREATE SEQUENCE, ALTERили CONTROL для схемы SCHEMA.

Всем привет! Сегодня мы поговорим про объект SEQUENCE (последовательность) в Microsoft SQL Server, Вы узнаете, что такое SEQUENCE, для чего этот объект нужен, какие у него особенности, и, конечно же, научитесь им пользоваться (создавать, изменять, удалять и использовать).

Объект SEQUENCE (последовательность) в Microsoft SQL Server

SEQUENCE в Microsoft SQL Server

SEQUENCE – это объект SQL Server, который генерирует числовые значения в определенной последовательности в соответствии с заданной спецификацией.

В числе основных предназначений SEQUENCE является формирования значений для столбца идентификаторов в таблицах.

В Microsoft SQL Server SEQUENCE, как объект, появился только в 2012 версии, ранее для формирования значений столбцов идентификаторов в таблицах использовалось свойство IDENTITY. Теперь для этих целей можно использовать и IDENTITY, и SEQUENCE, в чем их отличие я подробно расскажу в следующих материалах.

SEQUENCE – это пользовательский объект, т.е. последовательность создают пользователи точно так же, как и другие объекты: хранимые процедуры, функции и так далее. Для создания последовательности требуются соответствующие разрешения, например, CREATE SEQUENCE. А члены предопределенных ролей db_owner и db_ddladmin по умолчанию могут выполнять любые операции с последовательностями.

Последовательность числовых значений в Microsoft SQL Server может формироваться в возрастающем или убывающем порядке с заданным интервалом. Кроме того, можно настроить перезапуск (т.е. зацикливание) последовательности, когда она исчерпана, а также задать минимальное и максимальное значения последовательности.

Значение последовательности получают с помощью вызова функции NEXT VALUE FOR, которое возвращает одно значение, однако можно получить сразу несколько значений за один раз, это делается с помощью системной процедуры sp_sequence_get_range.

SEQUENCE можно изменить уже после создания, так же, как и другие объекты, это делается с помощью инструкции ALTER SEQUENCE.

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

Управляется кэширование последовательности с помощью параметра CACHE, который по умолчанию включен. Для его отключения необходимо указать NO CACHE.

Посмотреть, какие последовательности есть в базе данных и получить все сопутствующие сведения о последовательностях (параметры, с которыми они создавались), Вы можете с помощью обращения к системному представлению sys.sequences.

Синтаксис SEQUENCE

Описание синтаксиса

Параметр Описание
CREATE SEQUENCE Инструкция создания объектов последовательности.
schema_name и sequence_name Имя схемы и имя последовательности.
value Значение параметра.
AS Тип данных значения, которое будет возвращать последовательность. Допускаются только целочисленные значения: TINYINT, SMALLINT, INT, BIGINT или NUMERIC с масштабом 0. Более подробно о типах данных можете посмотреть в отдельном материале – Типы данных в T-SQL (Microsoft SQL Server). Если тип данных не указан, то по умолчанию используется BIGINT.
START WITH Начальное значение, возвращаемое объектом последовательности. Это значение должно быть не больше максимального и не меньше минимального значения объекта последовательности. По умолчанию начальным значением у возрастающей последовательности является минимально возможное значение, а для убывающей последовательности – максимально возможное.
INCREMENT BY Значение, на которое увеличивается (или уменьшается) значение объекта последовательности.
Если данное значение отрицательное, то объект последовательности убывает, если положительное, то возрастает.
По умолчанию используется значение 1. Данное значение не может быть равно 0.
MINVALUE Минимальное значение объекта последовательности.
По умолчанию минимальным значением для новой последовательности является минимальное значение для типа данных этой последовательности. Обращаю внимание, что для всех типов данных, кроме tinyint, минимальное значение – это отрицательное число.
MAXVALUE Максимальное значение объекта последовательности.
По умолчанию максимальным значением для последовательности является максимальное значение типа данных объекта последовательности.
CYCLE Параметр показывает, должна ли последовательность быть перезапущена, как только она достигнет своего максимального или минимального значения. По умолчанию используется параметр NO CYCLE.
CACHE Параметр, который управляет кэшированием значений объектов последовательности. По умолчанию имеет значение CACHE. Для отключения кэширования необходимо указать NO CACHE.

Практически все параметры являются необязательными, для создания последовательности с параметрами по умолчанию необходимо указать всего лишь инструкцию создания последовательности и имя последовательности. Однако начальное значение последовательности лучше все-таки указывать, если она будет использоваться в качестве генератора идентификаторов для таблицы.

Примеры создания SEQUENCE в Microsoft SQL Server

Теперь давайте разберём, как создается последовательность в Microsoft SQL Server.
Для выполнения примеров у меня есть база данных Test, в которой я и буду создавать последовательность.

Заметка! Для комплексного изучения языка SQL и T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, в которых используется последовательная методика обучения специально для начинающих.

Во всех примерах последовательность будет создаваться с названием TestSequence в схеме по умолчанию (dbo), поэтому в инструкциях я не буду указывать конкретное название схемы.

В этом материале мы рассмотрим конструктор табличных значений языка T-SQL, а именно Вы узнаете, что это такое и как использовать данный конструктор на практике.

Конструктор табличных значений T-SQL

Что такое конструктор табличных значений в языке T-SQL?

Конструктор табличных значений – это возможность языка Transact-SQL, с помощью которой можно создать набор значений строк, для того чтобы использовать этот набор в качестве таблицы. Другими словами, эта возможность позволяет указывать в одной инструкции DML несколько строк данных.

Конструктор табличных значений можно использовать в предложении VALUES инструкции INSERT, в предложении USING инструкции MERGE, а также для формирования таблицы в предложении FROM.

Данный конструктор можем быть полезен, например, в тех случаях, когда Вам необходимо осуществить вставку нескольких строк в таблицу в одной инструкции INSERT, т.е. Вы не хотите писать для каждой добавляемой строки отдельную инструкцию INSERT.

Упрощённый синтаксис

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

Во время добавления нескольких строк с помощью инструкции INSERT, значения соблюдают такие же правила преобразования типов данных, как и в инструкции UNION ALL, т.е. при несовпадении типов будет происходить неявное преобразование к типу с более высоким приоритетом. Будет возвращаться ошибка, в случае если указанные значения не поддерживают неявное преобразование.

Для конструктора табличных значений существует ограничение, с помощью него можно создать максимум 1000 строк.

Примеры использования конструктора табличных значений в T-SQL

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

Пример с INSERT — вставка нескольких строк

В первом примере давайте вставим несколько строк в таблицу, используя одну инструкцию INSERT.

Скриншот 1

Как видим, у нас вставилось 3 строки.

Пример с FROM – формирование таблицы и обращение к ней

Теперь давайте сформируем таблицу с помощью конструктора табличных значений и обратимся к ней, т.е. сделаем выборку.

Скриншот 2

Вот таким образом можно использовать конструктор табличных значений в предложение FROM. Точно также его можно использовать в предложение USING инструкции MERGE.

Я бы не сказал, что эта возможность очень полезна, но в то же время я считаю, что о конструкторе табличных значений Transact-SQL знать нужно, в своей книге «SQL код» я подробно рассказываю про другие полезные возможности языка SQL, на этом у меня все, пока!

Заметка! Для профессионального изучения языка T-SQL рекомендую посмотреть мои видеокурсы по T-SQL.

Читайте также: