Поделиться через


Инструкции SET (Transact-SQL)

Язык Transact-SQL предоставляет несколько инструкций SET, которые изменяют текущий сеанс, управляя специфическими данными. Инструкции SET группируются в категории, показанные в следующей таблице.

Сведения об установке локальных переменных с помощью инструкции SET см. в разделе SET @local\_variable (Transact-SQL).

Категория

Инструкции

Инструкции даты и времени

SET DATEFIRST

SET DATEFORMAT

Инструкции блокировки

SET DEADLOCK_PRIORITY

SET LOCK_TIMEOUT

Прочие инструкции

SET CONCAT_NULL_YIELDS_NULL

SET CURSOR_CLOSE_ON_COMMIT

SET FIPS_FLAGGER

SET IDENTITY_INSERT

SET LANGUAGE

SET OFFSETS

SET QUOTED_IDENTIFIER

Инструкции выполнения запросов

SET ARITHABORT

SET ARITHIGNORE

SET FMTONLY

Примечание

В будущей версии Microsoft SQL Server этот компонент будет удален. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется.

SET NOCOUNT

SET NOEXEC

SET NUMERIC_ROUNDABORT

SET PARSEONLY

SET QUERY_GOVERNOR_COST_LIMIT

SET ROWCOUNT

SET TEXTSIZE

Инструкции настроек ISO

SET ANSI_DEFAULTS

SET ANSI_NULL_DFLT_OFF

SET ANSI_NULL_DFLT_ON

SET ANSI_NULLS

SET ANSI_PADDING

SET ANSI_WARNINGS

Статистические инструкции

SET FORCEPLAN

SET SHOWPLAN_ALL

SET SHOWPLAN_TEXT

SET SHOWPLAN_XML

SET STATISTICS IO

SET STATISTICS XML

SET STATISTICS PROFILE

SET STATISTICS TIME

Инструкции управления транзакциями

SET IMPLICIT_TRANSACTIONS

SET REMOTE_PROC_TRANSACTIONS

SET TRANSACTION ISOLATION LEVEL

SET XACT_ABORT

Рекомендации по использованию инструкций 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 на этих таблицах или индексных представлениях, как будто индексы на вычисляемых столбцах или на представлениях не существуют.