@@OPTIONS: примеры (SQL)
@@OPTIONS: intОписание функции @@OPTIONS
Функция @@OPTIONS в Microsoft SQL Server возвращает целочисленное значение, представляющее битовую маску с информацией о текущих настройках сеанса (session). Эти настройки были установлены с помощью команды SET.
Функция не принимает аргументов и вызывается как системная глобальная переменная. Возвращаемое значение является битовой маской, где каждый бит или группа битов соответствуют определенному параметру. Значение является совокупностью всех текущих установок. Для интерпретации результата необходимо сравнивать возвращенное число с предопределенными константами, используя побитовые операции.
Основные битовые маски и их значение:
- 1 (DISABLE_DEF_CNST_CHK) - Управляет промежуточной или отложенной проверкой ограничений.
- 2 (IMPLICIT_TRANSACTIONS) - Определяет, включен ли режим неявных транзакций.
- 4 (CURSOR_CLOSE_ON_COMMIT) - Управляет поведением курсоров после выполнения COMMIT.
- 8 (ANSI_WARNINGS) - Включение предупреждений ANSI для условий, таких как деление на ноль.
- 16 (ANSI_PADDING) - Определяет, как обрабатываются пробелы в данных типа char/varchar.
- 32 (ANSI_NULLS) - Определяет семантику сравнения с NULL при использовании операторов '=' и '!='.
- 64 (ARITHABORT) - Прерывание запроса при возникновении ошибки переполнения или деления на ноль.
- 128 (ARITHIGNORE) - Возврат NULL при ошибках арифметических операций.
- 256 (QUOTED_IDENTIFIER) - Разрешение использования двойных кавычек для идентификаторов.
- 512 (NOCOUNT) - Отключение сообщения о количестве обработанных строк.
- 1024 (ANSI_NULL_DFLT_ON) - Установка столбца по умолчанию в NULL при создании таблицы (если не указано иное).
- 2048 (ANSI_NULL_DFLT_OFF) - Противоположность предыдущему параметру.
- 4096 (CONCAT_NULL_YIELDS_NULL) - Результат конкатенации с NULL дает NULL.
- 8192 (NUMERIC_ROUNDABORT) - Генерация ошибки при потере точности в выражениях.
- 16384 (XACT_ABORT) - Автоматический откат транзакции при ошибке выполнения.
Для проверки состояния конкретной опции используется побитовая операция & (AND).
Примеры использования
Простейший пример получения текущих настроек:
SELECT @@OPTIONS AS CurrentOptions;CurrentOptions ---------------- 5496
Проверка, включена ли опция ANSI_NULLS (бит 32):
SELECT CASE @@OPTIONS & 32
WHEN 32 THEN 'ANSI_NULLS ON'
ELSE 'ANSI_NULLS OFF'
END AS ANSI_NULLS_Status;ANSI_NULLS_Status ------------------ ANSI_NULLS ON
Проверка состояния нескольких ключевых опций:
SELECT
CASE WHEN (@@OPTIONS & 512) = 512 THEN 'ON' ELSE 'OFF' END AS 'NOCOUNT',
CASE WHEN (@@OPTIONS & 32) = 32 THEN 'ON' ELSE 'OFF' END AS 'ANSI_NULLS',
CASE WHEN (@@OPTIONS & 256) = 256 THEN 'ON' ELSE 'OFF' END AS 'QUOTED_IDENTIFIER';
NOCOUNT | ANSI_NULLS | QUOTED_IDENTIFIER --------|------------|------------------ OFF | ON | ON
Похожие функции в MS SQL
Для получения информации о настройках сеанса в SQL Server можно использовать и другие методы:
- sys.dm_exec_sessions: Динамическое административное представление, которое возвращает детальную информацию обо всех активных сеансах, включая многие настройки в виде отдельных столбцов (например,
ansi_nulls,ansi_padding). Это более удобный и читаемый способ, чем декодирование битовой маски@@OPTIONS.SELECT session_id, ansi_nulls, ansi_padding, quoted_identifier FROM sys.dm_exec_sessions WHERE session_id = @@SPID; - DBCC USEROPTIONS: Команда, которая возвращает текущие настройки SET для сеанса в виде таблицы с парами 'Set Option' и 'Value'. Удобна для быстрого просмотра человекочитаемого формата.
DBCC USEROPTIONS;
Рекомендации по выбору: Для программной обработки в T-SQL коде лучше использовать sys.dm_exec_sessions. Для администрирования и быстрой проверки удобна команда DBCC USEROPTIONS. Функция @@OPTIONS полезна для быстрой битовой проверки одной-двух опций в условных конструкциях.
Аналоги в других СУБД и языках
- MySQL: Не имеет прямой аналогии. Для просмотра переменных сеанса используется команда
SHOW VARIABLESили запрос кSESSION_VARIABLES.SHOW SESSION VARIABLES LIKE 'sql_mode'; -- Или SELECT @@SESSION.sql_mode; - PostgreSQL: Использует команду
SHOWдля отдельного параметра или представлениеpg_settings.SHOW search_path; -- Или SELECT name, setting FROM pg_settings WHERE category = 'Client Connection'; - Oracle: Параметры сессии, подобные настройкам NLS, можно найти в представлениях
NLS_SESSION_PARAMETERSилиV$PARAMETER.SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT'; - SQLite: Ограниченный набор прагм, которые можно получить или установить. Нет единой функции для всех настроек.
PRAGMA foreign_keys; -- Возвращает состояние опции FOREIGN KEYS
Основное отличие @@OPTIONS от большинства аналогов - возврат всех настроек в виде одного целого числа (битовой маски), что является уникальным для SQL Server подходом.
Типичные ошибки
- Неправильная интерпретация числового результата: Распространенная ошибка - попытка интерпретировать возвращенное целое число напрямую, без использования побитовых операций.
-- НЕВЕРНО: Сравнивать значение напрямую с номером бита IF @@OPTIONS = 512 -- Это проверяет, РАВНО ЛИ ВСЕ значение 512, а не включен ли бит. PRINT 'NOCOUNT is ON'; -- ВЕРНО: Использовать побитовое AND IF (@@OPTIONS & 512) = 512 PRINT 'NOCOUNT is ON'; - Путаница в приоритете операций: Если не использовать скобки в условии с побитовой операцией, результат может быть неожиданным из-за приоритета операторов.
-- НЕВЕРНО: Приоритет '&' ниже, чем '=' IF @@OPTIONS & 512 = 512 -- Вычисляется как @@OPTIONS & (512 = 512) -> @@OPTIONS & 1 PRINT 'Check'; -- ВЕРНО: Всегда заключать побитовую операцию в скобки IF (@@OPTIONS & 512) = 512 PRINT 'Check'; - Попытка изменить настройки через @@OPTIONS: Функция только для чтения. Для изменения параметров необходимо использовать команду
SET.-- НЕВЕРНО: SET @@OPTIONS = @@OPTIONS | 512; -- Ошибка синтаксиса -- ВЕРНО: SET NOCOUNT ON; -- Включает бит 512
Изменения в последних версиях
Функция @@OPTIONS остается обратно совместимой. Ее основное поведение и возвращаемое значение не менялись кардинально. Однако, с появлением новых версий SQL Server могут добавляться новые параметры команд SET, которым соответствуют новые биты в битовой маске. Например, параметры, связанные с уровнем совместимости базы данных или новыми стандартами ANSI, могут получить свои битовые позиции. Разработчикам следует учитывать, что одно и то же числовое значение @@OPTIONS в разных версиях сервера может иметь несколько разную семантику из-за наличия дополнительных неиспользуемых битов. Актуальный список соответствий всегда можно найти в документации Microsoft для конкретной версии SQL Server.
Расширенные примеры использования
Создание пользовательской функции для расшифровки основных опций:
CREATE FUNCTION dbo.fn_DecodeSessionOptions(@OptionsMask INT)
RETURNS TABLE
AS
RETURN (
SELECT
CASE WHEN @OptionsMask & 1 > 0 THEN 1 ELSE 0 END AS DISABLE_DEF_CNST_CHK,
CASE WHEN @OptionsMask & 2 > 0 THEN 1 ELSE 0 END AS IMPLICIT_TRANSACTIONS,
CASE WHEN @OptionsMask & 8 > 0 THEN 1 ELSE 0 END AS ANSI_WARNINGS,
CASE WHEN @OptionsMask & 32 > 0 THEN 1 ELSE 0 END AS ANSI_NULLS,
CASE WHEN @OptionsMask & 256 > 0 THEN 1 ELSE 0 END AS QUOTED_IDENTIFIER,
CASE WHEN @OptionsMask & 512 > 0 THEN 1 ELSE 0 END AS NOCOUNT,
CASE WHEN @OptionsMask & 4096 > 0 THEN 1 ELSE 0 END AS CONCAT_NULL_YIELDS_NULL,
CASE WHEN @OptionsMask & 16384 > 0 THEN 1 ELSE 0 END AS XACT_ABORT
);
GO
SELECT * FROM dbo.fn_DecodeSessionOptions(@@OPTIONS);
DISABLE_DEF_CNST_CHK | IMPLICIT_TRANSACTIONS | ANSI_WARNINGS | ANSI_NULLS | QUOTED_IDENTIFIER | NOCOUNT | CONCAT_NULL_YIELDS_NULL | XACT_ABORT ---------------------|-----------------------|---------------|------------|-------------------|---------|-------------------------|----------- 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0
Динамическое изменение логики выполнения в зависимости от текущих настроек. Например, временно отключить NOCOUNT для определенной операции, если он включен:
DECLARE @OriginalOptions INT = @@OPTIONS;
DECLARE @WasNoCountOn BIT = CASE WHEN (@OriginalOptions & 512) = 512 THEN 1 ELSE 0 END;
IF @WasNoCountOn = 1
SET NOCOUNT OFF; -- Временно выключаем для видимости счетчика строк
-- Код, для которого важен вывод COUNT
SELECT TOP 5 * FROM sys.objects;
-- Восстанавливаем исходное состояние NOCOUNT
IF @WasNoCountOn = 1
SET NOCOUNT ON;
Сравнение настроек текущего сеанса с настройками по умолчанию (например, для сеанса с ID 1, который часто является системным):
DECLARE @DefaultOptions INT;
SELECT @DefaultOptions = options FROM sys.dm_exec_sessions WHERE session_id = 1;
SELECT
'CURRENT' AS Session_Type,
CASE WHEN (@@OPTIONS & 32) = 32 THEN 'ON' ELSE 'OFF' END AS ANSI_NULLS,
CASE WHEN (@@OPTIONS & 256) = 256 THEN 'ON' ELSE 'OFF' END AS QUOTED_IDENTIFIER
UNION ALL
SELECT
'DEFAULT (session 1)',
CASE WHEN (@DefaultOptions & 32) = 32 THEN 'ON' ELSE 'OFF' END,
CASE WHEN (@DefaultOptions & 256) = 256 THEN 'ON' ELSE 'OFF' END;
Session_Type | ANSI_NULLS | QUOTED_IDENTIFIER --------------------|------------|------------------ CURRENT | ON | ON DEFAULT (session 1) | ON | ON