SET (Transact-SQL)
Язык Transact-SQL предоставляет несколько инструкций SET, которые изменяют текущий сеанс, управляя специфическими данными. Инструкции SET группируются в категории, показанные в следующей таблице.
Сведения об установке локальных переменных с помощью инструкции SET см. в разделе SET @local\_variable (Transact-SQL).
Категория |
Инструкции |
---|---|
Инструкции даты и времени |
|
Инструкции блокировки |
|
Прочие инструкции |
|
Инструкции выполнения запросов |
|
Инструкции настроек ISO |
|
Статистические инструкции |
|
Инструкции управления транзакциями |
Рекомендации по использованию инструкций SET
Все инструкции SET выполняются во время запуска или выполнения, за исключением FIPS_FLAGGER, SET OFFSETS, SET PARSEONLY и SET QUOTED_IDENTIFIER. Эти инструкции выполняются во время синтаксического анализа.
Если инструкция SET запускается в хранимой процедуре или триггере, значение параметра инструкции SET восстанавливается после того, как управление вернется из хранимой процедуры или триггера. Также если инструкция SET указана в динамической строке SQL, которая выполняется с помощью процедуры sp_executesql или инструкции EXECUTE, значение параметра инструкции SET восстанавливается после того, как управление вернется из пакета, указанного в динамической строке SQL.
Хранимые процедуры выполняются с настройками SET, указанными во время выполнения, кроме инструкций SET ANSI_NULLS и SET QUOTED_IDENTIFIER. Хранимые процедуры, использующие инструкцию SET ANSI_NULLS или SET QUOTED_IDENTIFIER, используют настройку, указанную в хранимой процедуре во время создания. При использовании внутри хранимой процедуры любые установки SET игнорируются.
Аргумент user options процедуры sp_configure допускает настройку в пределах сервера и работает с множеством баз данных. Эта настройка ведет себя так же, как и явная инструкция SET, за исключением того, что возникает во время входа в систему.
Настройки базы данных, устанавливаемые с помощью инструкции ALTER DATABASE, действительны только на уровне базы данных и применяются только при явном задании. Настройки базы данных перекрывают настройки параметров экземпляра, которые устанавливаются с помощью процедуры sp_configure.
Для любой из инструкций SET со значениями ON и OFF можно указать значения ON или OFF для множества параметров SET.
Примечание Это неприменимо к статистическим параметрам SET.
Например, инструкция SET QUOTED_IDENTIFIER, ANSI_NULLS ON устанавливает параметры QUOTED_IDENTIFIER и ANSI_NULLS в значение ON.
Настройки инструкции SET перекрывают эквивалентные настройки параметров базы данных, которые были установлены с помощью инструкции ALTER DATABASE. Например, значение, указанное в инструкции SET ANSI_NULLS, перекроет настройку базы данных для параметра ANSI_NULL. Кроме того, некоторые настройки соединений автоматически устанавливаются в значение ON, если пользователь соединяется с базой данных, основываясь на значениях, заданных предыдущим использованием настроек процедуры sp_configure user options, или на значениях, которые применимы ко всем соединениям ODBC и OLE/DB.
Настройка SET LOCK_TIMEOUT не влияет на выполнение инструкций ALTER, CREATE и DROP DATABASE.
Каждая следующая инструкция SET, такая как SET ANSI_DEFAULTS, отменяет предыдущую настройку. Если индивидуальный параметр инструкции SET, связанной с сочетанием клавиш, явно устанавливается после вызова такого сочетания, то индивидуальная инструкция SET перекрывает подобную настройку.
При использовании пакетов контекст базы данных определяется пакетом, установленным с помощью инструкции USE. Нерегламентированные запросы и все другие инструкции, которые выполняются за пределами хранимых процедур и которые содержатся в пакетах, наследуют настройки параметров базы данных и соединения, установленные с помощью инструкции USE.
Запросы режима MARS совместно используют глобальное состояние, которое содержит большую часть настроек параметров SET последней сессии. Настройки SET могут измениться при выполнении любого запроса. Значения специфичны для контекста запроса, в котором они устанавливаются, и не влияют на другие параллельные запросы режима MARS. Однако после завершения выполнения запроса новые параметры SET копируются в глобальное состояние сеанса. Новые запросы, которые выполняются в том же самом сеансе, после этого изменения будут использовать новые значения параметров SET.
При выполнении хранимой процедуры из пакета либо из другой хранимой процедуры она выполняется под значениями параметров, которые установлены в данный момент в базе данных, содержащей хранимую процедуру. Например, если хранимая процедура db1.dbo.sp1 вызывает хранимую процедуру db2.dbo.sp2, то хранимая процедура sp1 выполняется под текущим значением уровня совместимости базы данных db1, а хранимая процедура sp2 — под текущим значением уровня совместимости базы данных db2.
Когда инструкция языка Transact-SQL ссылается на объект, который размещен на многих базах данных, к ней применяется текущий контекст базы данных и текущий контекст соединения. В этом случае, если инструкция языка Transact-SQL находится в пакете, текущим контекстом соединения является база данных, определенная инструкцией USE. Если инструкция языка Transact-SQL находится в хранимой процедуре, то контекстом соединения является база данных, которая содержит хранимую процедуру.
При создании индексов на вычисляемых столбцах и индексированных представлениях, а также при управлении ими параметры SET ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_PADDING и ANSI_WARNINGS должны иметь значение ON. Параметр NUMERIC_ROUNDABORT должен быть установлен в значение OFF.
Если любой из этих параметров не установлен в требуемое значение, то выполнение инструкций INSERT, UPDATE, DELETE, DBCC CHECKDB и DBCC CHECKTABLE на индексированных представлениях или таблицах с индексами на основе вычисляемых столбцов будет приводить к ошибкам. SQL Server выведет ошибку с перечислением всех неверно установленных параметров. Также SQL Server будет выполнять инструкции SELECT на этих таблицах или индексных представлениях, как будто индексы на вычисляемых столбцах или на представлениях не существуют.