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 选项的值。同样,如果 SET 语句是在使用 sp_executesql 或 EXECUTE 运行的动态 SQL 字符串中指定的,则从在动态 SQL 字符串中指定的批处理返回控制后,将恢复 SET 选项的值。
存储过程使用执行时指定的 SET 设置执行,但 SET ANSI_NULLS 和 SET QUOTED_IDENTIFIER 除外。指定 SET ANSI_NULLS 或 SET QUOTED_IDENTIFIER 的存储过程使用创建存储过程时指定的设置。如果在存储过程内使用任何 SET 设置,则该设置将被忽略。
sp_configure 的 user options 设置允许服务器范围的设置,并可以跨多个数据库运行。此设置的行为还类似于显式 SET 语句,只是后者发生在登录时。
使用 ALTER DATABASE 设置的数据库设置仅在数据库级有效,并且仅在显式设置时有效。数据库设置优先于使用 sp_configure 设置的实例选项设置。
对于任何带 ON 和 OFF 设置的 SET 语句,可以为多个 SET 选项指定 ON 或 OFF 设置。
注意 这不适用与统计相关的 SET 选项。
例如,SET QUOTED_IDENTIFIER, ANSI_NULLS ON 可将 QUOTED_IDENTIFIER 和 ANSI_NULLS 设置为 ON。
SET 语句设置优先于使用 ALTER DATABASE 设置的等价数据库选项设置。例如,SET ANSI_NULLS 语句中指定的值将覆盖 ANSI_NULL 的数据库设置。此外,如果用户在连接到数据库时依据的值是因为先前使用 sp_configure user options 设置而生效的,或者所依据的值适用于所有 ODBC 和 OLE/DB 连接,则一些连接设置将自动设置为 ON。
ALTER、CREATE 和 DROP DATABASE 语句不提供 SET LOCK_TIMEOUT 设置。
当全局或快捷 SET 语句(如 SET ANSI_DEFAULTS)设置多个设置时,发出快捷 SET 语句后,将重设所有受该快捷 SET 语句影响的选项的先前设置。如果在发出快捷 SET 语句后显式设置了受快捷 SET 语句影响的单个 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 语句,就好像计算列或视图中不存在索引。