导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

select .....with的用法

zhnzzy 2008-01-18 11:54:41
谁可以详细讲讲with的用法!
只看到过 select ---with nolock 和SELECT * FROM tb WITH(INDEX=IDX_tb_b) 这样的,一般with是做什么用的.
...全文
1132 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxmcxm 2008-03-02
加上锁参数
table_hint > ::=
{ INDEX ( index_val [ ,...n ] )
| FASTFIRSTROW
| HOLDLOCK
| NOLOCK
| PAGLOCK
| READCOMMITTED
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
| XLOCK
}

参数
INDEX ( index_val [ ,...n ] )

指定 SQL Server 在处理语句时使用的索引的名称或 ID。只能为每个表指定一个索引提示。

如果存在聚集索引,则 INDEX(0) 强制聚集索引扫描,而 INDEX(1) 强制聚集索引扫描或查找。如果不存在聚集索引,则 INDEX(0) 强制表扫描,而 INDEX(1) 则被解释为错误。

选择性的 INDEX = 语法(用于指定单一索引提示)只受向后兼容性的支持。

如果在单一提示列表中使用了多个索引,则将忽略重复项,所列出的其余索引将用于检索表中的行。索引提示中的索引顺序很重要。多索引提示还强制索引 ANDing,且 SQL Server 在所访问的每个索引上应用尽可能多的条件。如果带提示的索引集合不是覆盖性的,则在检索全部索引列后执行一次提取操作。



说明 如果在星型联接的事实数据表中使用引用多个索引的索引提示,则 SQL Server 将忽略该索引提示并返回一条警告消息。此外,不允许在指定了索引提示的表上使用索引 OR 运算。


表提示中的最大索引数为 250 个非聚集索引。

FASTFIRSTROW

等同于 OPTION (FAST 1)。有关更多信息,请参见 SELECT 中 OPTION 子句的 FAST。

HOLDLOCK

等同于 SERIALIZABLE。(有关更多信息,请参见本主题下面的 SERIALIZABLE。)HOLDLOCK 选项仅适用于指定了该选项的表或视图,且仅限于由它所在语句所定义的事务的时间段内。HOLDLOCK 不能用于包括 FOR BROWSE 选项的 SELECT 语句。

NOLOCK

等同于 READUNCOMMITTED。有关更多信息,请参见本主题后面的 READUNCOMMITTED。

PAGLOCK

在通常采取单个共享表锁的地方采取共享页锁。

READCOMMITTED

指定用与运行在 READ COMMITTED 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。

READPAST

指定跳过(越过读取)锁定的行。例如,假设表 T1 包含单个整数列,其值为 1、2、3、4 和 5。如果事务 A 将值 3 更改为 8,但尚未提交,则 SELECT * FROM T1 (READPAST) 将生成值 1、2、4 和 5。READPAST 仅适用于在 READ COMMITTED 隔离级别操作的事务,且只越过读取行级锁。该锁提示主要用于在 SQL Server 表中实现工作队列。

READUNCOMMITTED

指定允许脏读。这表示不发放共享锁,也不遵守排它锁。允许脏读会导致更高的并发性,但会降低一致性。如果指定了 READUNCOMMITTED,就有可能读取未提交的事务,或读取在读取过程中回滚的一套页,因此可能出现错误信息。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。



说明 如果在指定了 READUNCOMMITTED 的情况下收到 601 号错误信息,则按解决死锁错误 (1205) 的方法解决该错误,然后重试执行语句。


REPEATABLEREAD

指定用与运行在 REPEATABLE READ 隔离级别的事务相同的锁定语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。

ROWLOCK

指定在通常采取单个共享页或表锁的情形下采取共享行锁。

SERIALIZABLE

等同于 HOLDLOCK。通过将共享锁保持到事务完成,使之更具有约束性(而不要不管事务是否完成,都在不再需要所需的表或数据页时就立即释放共享锁)。用与运行在 SERIALIZABLE 隔离级别的事务相同的语义执行扫描。有关隔离级别的更多信息,请参见 SET TRANSACTION ISOLATION LEVEL。

TABLOCK

指定在表上采取的共享锁一直保持到语句结束。如果同时指定 HOLDLOCK,那么在事务结束之前该共享表锁将一直保持。

TABLOCKX

指定在表上采取的排它锁一直保持到语句结束或事务结束。

UPDLOCK

指定读取表时采取更新锁而不是共享锁,且将这些更新锁保持到语句结束或事务结束。

XLOCK

指定应采取排它锁,且保持到由语句所处理的全部数据上的事务结束。如果与 PAGLOCK 或 TABLOCK 一同指定,则排它锁适用于适当的粒度级别。

回复
中国风 2008-03-02
WITH (<table_hint> )
指定查询优化器对此表和此语句使用优化或锁定策略。有关详细信息,请参阅表提示 (Transact-SQL)。

在 SQL Server 2005 中,除一些例外情况之外,仅当使用了 WITH 关键字指定表提示时,FROM 子句中才支持这些提示。指定表提示时还必须使用圆括号。

使用或不使用 WITH 关键字均可使用的表提示如下:NOLOCK、READUNCOMMITTED、UPDLOCK、REPEATABLEREAD、SERIALIZABLE、READCOMMITTED、FASTFIRSTROW、TABLOCK、TABLOCKX、PAGLOCK、ROWLOCK、NOWAIT、READPAST、XLOCK 和 NOEXPAND。不使用 WITH 关键字指定这些表提示时,必须单独指定提示。例如:FROM t (fastfirstrow)。

使用另一个选项指定提示时(如 (fastfirstrow, index(myindex) 所示),必须使用 WITH 关键字指定提示,例如:

FROM t WITH (fastfirstrow, index(myindex)).

当数据库的兼容级别为 80 或更低时,可以不使用 WITH 关键字来指定提示。
回复
-狙击手- 2008-03-02

和指定 索引
回复
Keambala 2008-03-02
值得了解一下!!!
回复
marco08 2008-01-18
参数选项吧
回复
sdsxlj 2008-01-18
加锁
回复
yangjiexi 2008-01-18
了解一下!!
回复
chuifengde 2008-01-18
这是查询中使用提示:包括几种情况
1.使用连接提示:select * from a aa Inner Hash Join b bb On aa.id=bb.id(强制用哈希连接方式)
2.使用表提示 :含锁:select * from test with(rowlock) 含索引select * from test with(index=索引名或索引顺序号(其中0代表表名))
3.使用查询提示:select id,count(1) from a group by id option(order group)
回复
月下之木 2008-01-18
我也刚看见 不知道你要的是不是这个 学习中
SQL Server 2005 联机丛书

WITH common_table_expression (Transact-SQL) 发送反馈
请参阅
全部折叠全部展开 语言筛选器: 全部语言筛选器: 多语言语言筛选器: Visual Basic语言筛选器: C#语言筛选器: C++语言筛选器: J#语言筛选器: JScript

Visual Basic(Declaration)
C#
C++
J#
JScript

指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。该表达式源自简单查询,并且在 SELECT、INSERT、UPDATE 或 DELETE 语句的执行范围内定义。该子句也可用在 CREATE VIEW 语句中,作为该语句的 SELECT 定义语句的一部分。公用表表达式可以包括对自身的引用。这种表达式称为递归公用表表达式。

Transact-SQL 语法约定

语法

[ WITH <common_table_expression> [ ,...n ] ]

<common_table_expression>::=
expression_name [ ( column_name [ ,...n ] ) ]
AS
( CTE_query_definition )



备注
创建和使用 CTE 的指南
下列指南应用于非递归 CTE。有关适用于递归 CTE 的指南,请参阅后面的“定义和使用递归 CTE 的指南”。

CTE 之后必须跟随引用部分或全部 CTE 列的 SELECT、INSERT、UPDATE 或 DELETE 语句。也可以在 CREATE VIEW 语句中将 CTE 指定为视图中 SELECT 定义语句的一部分。


可以在非递归 CTE 中定义多个 CTE 查询定义。定义必须与以下集合运算符之一结合使用:UNION ALL、UNION、INTERSECT 或 EXCEPT。


CTE 可以引用自身,也可以引用在同一 WITH 子句中预先定义的 CTE。不允许前向引用。


不允许在一个 CTE 中指定多个 WITH 子句。例如,如果 CTE_query_definition 包含一个子查询,则该子查询不能包括定义另一个 CTE 的嵌套的 WITH 子句。


不能在 CTE_query_definition 中使用以下子句:


COMPUTE 或 COMPUTE BY


ORDER BY(除非指定了 TOP 子句)


INTO


带有查询提示的 OPTION 子句


FOR XML


FOR BROWSE


如果将 CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾。


可以使用引用 CTE 的查询来定义游标。


可以在 CTE 中引用远程服务器中的表。


在执行 CTE 时,任何引用 CTE 的提示都可能与该 CTE 访问其基础表时发现的其他提示相冲突,这种冲突与引用查询中的视图的提示所发生的冲突相同。发生这种情况时,查询将返回错误。有关详细信息,请参阅视图解析。


定义和使用递归 CTE 指南
下列指南适用于定义递归 CTE 的情况:

递归 CTE 定义至少必须包含两个 CTE 查询定义,一个定位点成员和一个递归成员。可以定义多个定位点成员和递归成员;但必须将所有定位点成员查询定义置于第一个递归成员定义之前。所有 CTE 查询定义都是定位点成员,但它们引用 CTE 本身时除外。


定位点成员必须与以下集合运算符之一结合使用:UNION ALL、UNION、INTERSECT 或 EXCEPT。在最后一个定位点成员和第一个递归成员之间,以及组合多个递归成员时,只能使用 UNION ALL 集合运算符。


定位点成员和递归成员中的列数必须一致。


递归成员中列的数据类型必须与定位点成员中相应列的数据类型一致。


递归成员的 FROM 子句只能引用一次 CTE expression_name。


在递归成员的 CTE_query_definition 中不允许出现下列项:


SELECT DISTINCT


GROUP BY


HAVING


标量聚合


TOP


LEFT、RIGHT、OUTER JOIN(允许出现 INNER JOIN)


子查询


应用于对 CTE_query_definition 中的 CTE 的递归引用的提示。


下列指南适用于使用递归 CTE:

无论参与的 SELECT 语句返回的列的为空性如何,递归 CTE 返回的全部列都可以为空。


如果递归 CTE 组合不正确,可能会导致无限循环。例如,如果递归成员查询定义对父列和子列返回相同的值,则会造成无限循环。可以使用 MAXRECURSION 提示以及在 INSERT、UPDATE、DELETE 或 SELECT 语句的 OPTION 子句中的一个 0 到 32,767 之间的值,来限制特定语句所允许的递归级数,以防止出现无限循环。这样就能够在解决产生循环的代码问题之前控制语句的执行。服务器范围内的默认值是 100。如果指定 0,则没有限制。每一个语句只能指定一个 MAXRECURSION 值。有关详细信息,请参阅查询提示 (Transact-SQL)。


不能使用包含递归公用表表达式的视图来更新数据。


可以使用 CTE 在查询上定义游标。递归 CTE 只允许使用快速只进游标和静态(快照)游标。如果在递归 CTE 中指定了其他游标类型,则该类型将转换为静态游标类型。


可以在 CTE 中引用远程服务器中的表。如果在 CTE 的递归成员中引用了远程服务器,那么将为每个远程表创建一个假脱机,这样就可以在本地反复访问这些表。



参数
expression_name

公用表表达式的有效标识符。 expression_name 必须与在同一 WITH <common_table_expression> 子句中定义的任何其他公用表表达式的名称不同,但 expression_name 可以与基表或基视图的名称相同。在查询中对 expression_name 的任何引用都会使用公用表表达式,而不使用基对象。

column_name

在公用表表达式中指定列名。在一个 CTE 定义中不允许出现重复的名称。指定的列名数必须与 CTE_query_definition 结果集中列数匹配。只有在查询定义中为所有结果列都提供了不同的名称时,列名称列表才是可选的。

CTE_query_definition

指定一个其结果集填充公用表表达式的 SELECT 语句。除了 CTE 不能定义另一个 CTE 以外,CTE_query_definition 的 SELECT 语句必须满足与创建视图时相同的要求。有关详细信息,请参阅“备注”部分和 CREATE VIEW (Transact-SQL)。

如果定义了多个 CTE_query_definition,则这些查询定义必须用下列一个集合运算符联接起来:UNION ALL、UNION、EXCEPT 或 INTERSECT。有关使用递归 CTE 查询定义的详细信息,请参阅下列“备注”部分和使用公用表表达式的递归查询。
回复
shirley_yue 2008-01-18
索引吧
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告