SET (Transact-SQL)

使用 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_configureuser 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 语句,就好像计算列或视图中不存在索引。