影响结果的 SET 选项
索引视图和索引计算列将结果存储在数据库中供日后引用。只有当所有引用索引视图或索引计算列的连接可生成与创建索引的连接相同的结果集时,存储的这些结果才有效。若要确保存储结果能得到正确地维护并返回一致的结果,则必须在出现下列情况时,将下表中的 SET 选项设置为“必需的值”列中显示的值:
为视图或计算列创建了索引。
定义了计算列并且指定了 PERSISTED。
INSERT、UPDATE 或 DELETE 操作修改存储在索引视图或索引计算列中的数据值。包括 BCP、DTS、复制和分布式查询等操作。
查询优化器使用查询执行计划中的索引。
由于 ANSI_NULLS 和 QUOTED_IDENTIFIER 选项的设置与索引视图元数据是存储在一起的,所以在创建索引视图时必须将它们设置为 ON。
SET 选项
必需的值
默认服务器值
默认
OLE DB 和 ODBC 值
默认
DB-Library 值
ANSI_NULLS
ON
OFF
ON
OFF
ANSI_PADDING
ON
ON
ON
OFF
ANSI_WARNINGS*
ON
OFF
ON
OFF
ARITHABORT
ON
ON
OFF
OFF
CONCAT_NULL_YIELDS_NULL
ON
OFF
ON
OFF
NUMERIC_ROUNDABORT
OFF
OFF
OFF
OFF
QUOTED_IDENTIFIER
ON
OFF
ON
OFF
*当数据库兼容级别设置为 90 或更高时,如果将 ANSI_WARNINGS 设置为 ON,则将使 ARITHABORT 隐式设置为 ON。如果数据库兼容级别设置为 80 或更低,则必须将 ARITHABORT 选项显式设置为 ON。
当 SET 选项设置不正确时,会发生下列情况。
数据库引擎生成错误并回滚所有对索引中存储的数据值进行更改的 INSERT、UPDATE、或 DELETE 语句。
查询优化器不考虑任何 Transact-SQL 语句执行计划中的索引。
无法创建索引视图或计算列。
OLE DB 和 ODBC 连接的 SET 选项设置
大多数应用程序使用 SQL Server OLE DB 访问接口或 SQL Server ODBC 驱动程序连接到 SQL Server 实例,包括 SQL Server Management Studio、Integration Services、复制和大容量复制操作。OLE DB 和 ODBC 的默认设置对于视图索引或计算列索引所需的六个 SET 选项是正确的。有关默认 OLE DB 和 ODBC 值,请参阅前面的表。这些设置强制执行 ISO 标准的规则并且是 SQL Server 的推荐设置。有关详细信息,请参阅客户端网络配置。
注意 |
---|
某些 SQL Server 实用工具将一项或多项 ANSI 设置设为 OFF 以保持与早期版本实用工具的兼容。 |
DB-Library 和 C 语言应用程序中的嵌入式 SQL 的 SET 选项设置
默认情况下,DB-Library 和 C 语言应用程序中的嵌入式 SQL 不设置任何会话选项。使用这些 API 的系统要么编写应用程序以发出适当的 SET 语句,要么将数据库或服务器的默认设置更改为正确设置。
设置选项的优先顺序
可以在多个级别上指定 SET 选项的 ON 或 OFF 设置。每个会话选项的最终设置由设置该选项的优先级最高的操作决定。下面列出了会话设置操作的优先级,优先级从高到低排列:
任何应用程序都可以在连接到服务器后执行 SET 语句来显式覆盖任何默认设置。SET 语句可覆盖所有以前的设置,可用于在应用程序运行时动态地打开或关闭选项。这些选项设置仅适用于当前连接会话。
OLE DB 和 ODBC 应用程序可以通过在连接字符串中指定选项设置来指定连接时的有效选项设置。这些选项设置仅适用于当前连接会话。
通过使用控制面板中的 ODBC 应用程序或 ODBC SQLConfigDataSource 函数,可以为 SQL Server ODBC 数据源指定 SET 选项。
数据库默认设置。您可以使用 ALTER DATABASE 或 SQL Server Management Studio 中的对象资源管理器指定这些值。
服务器默认设置。您可以使用 sp_configure 或 SQL Server Management Studio 中的对象资源管理器来指定这些值以设置名为 user options 的服务器配置选项。
例如,ODBC 的 ANSI_NULLS 默认值为 ON。但是,您可以在 ODBC 连接字符串中将该选项设置为 OFF 或在连接到数据库后使用 SET 语句来覆盖该值。
存储过程和触发器
编写存储过程和触发器时应使其能够操作支持索引视图或索引计算列所需的六个 SET 选项。如果 SET 选项设置不正确,查询优化器将不在存储过程或触发器执行的 SELECT 语句中使用视图索引或计算列索引。在存储过程或触发器中使用 INSERT、UPDATE、或 DELETE 语句来修改索引视图或索引计算列中所存储的数据时,会出现错误。
注意事项
SET 语句可以动态更改会话选项。因此,在具有索引视图和索引计算列的数据库中发出 SET 语句时必须谨慎。例如,一个应用程序可以进行一个连接,连接中的默认设置允许引用索引视图或索引计算列。但是,如果连接调用的存储过程或触发器的第一条语句是 SET ANSI_WARNINGS OFF,则此语句将覆盖 ANSI_WARNINGS 以前的默认值或设置。在这种情况下,优化器会在处理存储过程或触发器中的任何语句的过程中忽略所有索引视图和索引计算列。
可能会影响结果集的格式的其他三个会话选项:DATEFIRST、DATEFORMAT 和 LANGUAGE。如果某些函数的结果会在这些选项更改后受到影响,则这些函数将归类为不确定性函数,并且不能用于索引视图或索引计算列。