Transact-SQL 参考
OPTION 子句

指定应在整个查询中使用所指定的查询提示。每个查询提示只能指定一次,但允许指定多个查询提示。用该语句只可能指定一个 OPTION 子句。查询提示影响语句中的所有运算符。如果主查询中涉及 UNION,则只有涉及 UNION 运算符的最后一个查询可以有 OPTION 子句。如果一个或多个查询提示导致查询优化器不生成有效计划,则产生 8622 号错误。

注意  查询优化器通常为查询选择最佳执行计划,因此建议有经验的数据库管理员将 <join_hint>、<query_hint> 和 <table_hint> 仅作为最后的手段。

语法

[ OPTION ( < query_hint > [ ,...n ) ]

< query_hint > ::=
    
{    { HASH | ORDER } GROUP
    | { CONCAT | HASH | MERGE } UNION

    | {LOOP | MERGE | HASH } JOIN
    | FAST number_rows
    | FORCE ORDER
    | MAXDOP number
    | ROBUST PLAN
    | KEEP PLAN
    | KEEPFIXED PLAN
    | EXPAND VIEWS
    }

参数

{ HASH | ORDER } GROUP

指定在 GROUP BY、DISTINCT 或 COMPUTE 查询子句中所描述的聚合应使用哈希操作或排列。

{ MERGE | HASH | CONCAT } UNION

指定由合并、哈希或串联 UNION 集合执行所有 UNION 运算。如果指定了不止一个 UNION 提示,查询优化器就会从这些指定的提示中选择开销最少的策略。

{ LOOP | MERGE | HASH } JOIN

指定在整个查询中所有的联接操作由循环联接、合并联接或哈希联接来完成。如果指定了多个联接提示,则优化器从允许的联接策略中选择最便宜的联接策略。

如果在同一个查询中,还为一对特定的表指定了联接提示,则虽然仍须遵守查询提示,但该联接提示将优先联接这两个表。因此,为这对表指定的联接提示可能只限制选择查询提示中允许的联接方法。有关详细信息,请参见提示

FAST number_rows

指定对查询进行优化,以便快速检索第一个 number_rows(非负整数)。在第一个 number_rows 返回后,查询继续进行并生成完整的结果集。

FORCE ORDER

指定在查询优化过程中保持由查询语法表示的联接顺序。

MAXDOP number

只对指定了 sp_configure max degree of parallelism 配置选项的查询替代该选项。当使用 MAXDOP 查询提示时,所有和 max degree of parallelism 配置选项一起使用的语义规则均适用。有关更多信息,请参见 max degree of parallelism 选项

ROBUST PLAN

强制查询优化器以性能为代价,使用对最大可能的行大小有效的计划。处理查询时,中间级表和运算符可能需要存储和处理比输入行宽的行。在有些情况下,行可能很宽,以致某个运算符无法处理行。如果发生这种情况,SQL Server 将在查询执行过程中生成错误。通过使用 ROBUST PLAN,可以指示查询优化器不考虑可能会遇到该问题的查询计划。

KEEP PLAN

强制查询优化器对查询放宽估计的重新编译阈值。估计的重新编译阈值是一个点,基于该点当对表的索引列更改(更新、删除或插入)达到估计的数字时自动重新编译查询。指定 KEEP PLAN 将确保当表有多个更新时不会频繁地对查询进行重新编译。

KEEPFIXED PLAN

强制查询优化器不因统计中的更改或索引列(更新、删除或插入)而重新编译查询。指定 KEEPFIXED PLAN 将确保仅当更改基础表的架构或在那些表上执行 sp_recompile 时才重新编译查询。

EXPAND VIEWS

指定展开索引视图,而且查询优化器不将任何索引视图看作是查询中任何部分的替代。(当视图名称由查询文本中的视图定义替换时,视图将展开。)实际上,该查询提示不允许在查询计划中直接使用索引视图和直接在索引视图上使用索引。

只有在查询的 SELECT 部分中直接引用视图,而且指定 WITH (NOEXPAND) 或 WITH(NOEXPAND、INDEX( index_val [ ,...n ] )),才会展开索引视图。有关查询提示 WITH (NOEXPAND) 的更多信息,请参见 FROM

只有语句的 SELECT 部分的视图(包括 INSERT、UPDATE 和 DELETE 语句中的视图)才受提示影响。

注释

SELECT 语句中的子句顺序非常重要。可以省略可选子句,但这些子句在使用时必须按适当的顺序出现。

只有当这些语句的选择列表包含给函数的局域变量赋值的表达式时,在用户定义的函数中才允许有 SELECT 语句。

table 变量的作用域内,可以像访问常规表那样访问 table 变量,因此可以在 SELECT 语句内将 table 变量作为表源使用。

对于由四部分组成的名称,若其中的服务器名称使用的是 OPENDATASOURCE 函数,则该名称可以在表名能够在 SELECT 语句内出现的任何位置作为表源使用。

对涉及远程表的 SELECT 语句有一些语法限制。有关更多信息,请参见外部数据和 Transact-SQL

选择列表内包含的text ntext 列的返回长度默认为最小的 text 实际大小、默认的 TEXTSIZE 会话设置或硬编码应用程序限制。若要更改会话的返回文本长度,请使用 SET 语句。默认情况下,用 SELECT 语句返回的文本数据的长度限制是 4,000 字节。

如果发生下列两种情况中的一种,SQL Server 将生成编号为 511 的异常错误并回滚当前执行的语句:

在 SQL Server 中,如果没有为 SELECT INTO 或 CREATE VIEW 语句创建的列提供列名,将会发生错误。

选择标识列

将现有标识列选入新表时,新列将继承 IDENTITY 属性,除非下列条件中的一个为真:

如果这些条件中的一个为真,列将被创建为 NOT NULL 而不继承 IDENTITY 属性。所有用于标识列的规则和限制均适用于新表。

旧式外联接

SQL Server 的早期版本支持在 WHERE 子句中使用 *= 和 =* 运算符定义外联接。SQL Server 7.0 版支持 SQL-92 标准,该标准在 FROM 子句中提供联接运算符。建议使用 SQL-92 语法重新编写查询。

WHERE、GROUP BY 和 HAVING 子句的处理顺序

下表显示带 WHERE 子句、GROUP BY 子句和 HAVING 子句的 SELECT 语句的处理顺序:

  1. WHERE 子句排除不满足搜索条件的行。

  2. GROUP BY 子句将选定的行收集到 GROUP BY 子句中各唯一值的组中。

  3. 在选择列表中指定的聚合函数计算各组的汇总值。

  4. HAVING 子句进一步排除不满足搜索条件的行。
权限

SELECT 权限默认授予 sysadmin 固定服务器角色成员、db_ownerdb_datareader 固定数据库角色的成员以及表的所有者。sysadmindb_owner db_securityadmin 角色的成员和表所有者可以将权限转让给其他用户。

如果用 INTO 子句创建永久表,用户必须在目的数据库中具有 CREATE TABLE 权限。

请参见

CONTAINS

CONTAINSTABLE

CREATE TRIGGER

CREATE VIEW

DELETE

EXECUTE

表达式

FREETEXT

FREETEXTTABLE

对 SQL Server 数据进行全文查询

INSERT

联接基础知识

SET TRANSACTION ISOLATION LEVEL

sp_dboption

子查询基础知识

table

UNION

UPDATE

使用变量和参数

WHERE