Microsoft SQL Server 2005技术内幕_第5章-视图 Views
该视图包含发生过订单的消费者。
注意:如果你尝试在SQL Server 2000中运行这段代码,会因为CREATE VIEW语句末尾的分号而导致失败。要在SQL Server 2000中创建该视图,删除分号即可。分号在ANSI中是必须的,而在以前T-SQL中不必使用分号。SQL Server 2005 只在某些情况下要求你必须使用分号,例如在定义CTE的WITH子句前面使用分号以避免混淆(因为WITH子句还有其他用途)。除此之外,分号的使用是可选的。然而,因为分号是ANSI所必须的,慢慢习惯使用分号也许是个好主意。
该视图的查询使用EXISTS谓词返回在Orders表中至少有一个订单的消费者。
提示:顺便提一下,通常在SELECT中使用*不是一个好习惯,但你可以在EXISTS谓词中放心使用。优化器知道EXISTS谓词不需要引用行的特定属性。它只关心行是否存在。因此,它会完全忽略SELECT列表。通过检查这些查询的执行计划你可以得出这个结论,你会注意到如果被筛选的列(在前面的例子
2
Microsoft SQL Server 2005技术内幕_第5章-视图 Views
代码运行时不产生错误,这就说明了SQL Server并没有计算表达式。如果SQL Server计算该表达式,你会收到一个错误。
下面这一节将更详细地研究视图的各种特性,先解释视图的查询中没有TOP或FOR XML说明符时禁止使用ORDER BY子句的原因。
注意,该错误并不是说ORDER BY完全被禁止,而是说只有在两种情况下可以使用该子句即指定TOP或FOR XML。TOP和FOR XML都是T-SQL的扩展,不是标准的SQL元素。TOP和ORDER BY以及ORDER BY和FOR XML是结果集规范(result set specification)的一部分,但单独的ORDER BY并不是。因此,TOP和ORDER BY以及ORDER BY和FOR XML可以出现在视图定义中,而单独的
3
Microsoft SQL Server 2005技术内幕_第5章-视图 Views
注意 上面的代码假定你正在使用SQL Server 2005。因此,它使用分号来结束ALTER VIEW语句,并在TOP选项中使用括号。如果你要在SQL Server 2000中测试这段代码,需要删除括号和分号。 视图中的ORDER BY子句意味着什么呢?它的意义不是很明确,因为TOP选项不是ANSI的标准语句。但如果你从集合的角度思考一下,就会认为ORDER BY子句没有什么意义了,因为你已经选择了所有符合筛选表达式(filter expression)的行。查询视图时,SQL Server不保证输出的顺序,除非在外部查询包含ORDER BY子句。SQL Server 2005联机丛书有一段对该行为的描述:“在视图、内联函数、派生表或子查询的定义中使用 ORDER BY 时,子句只用于确定 TOP 子句返回的行。ORDER BY 不保证
4