【问题提问、论坛交流】
即使某个表达式具有确定性(如果其包含浮点表达式),确切的结果可能依处理器体系结构或微码的版本而定。为了在计算机间迁移数据库时确保 SQL Server 2005 中数据的完整性,这种表达式只能作为索引视图的非键列加入。不含浮点表达式的具有确定性的表达式被认为是精确的。只有永久和/或精确的具有确定性的表达式才可加入键列以及索引视图的 WHERE 或 GROUP BY 子句。永久性表达式是对已保存列的引用,包括一般列和标为 PERSISTED 的计算列。
用 COLUMNPROPERTY 函数和 IsDeterministic 属性确定视图列是否具有确定性。用 COLUMNPROPERTY 函数和 IsPrecise 属性确定带有 SCHEMABINDING 的视图中的具有确定性的列是精确的。如果属性为 TRUE,COLUMNPROPERTY 将返回 1;如为 FALSE,则返回 0;而如果为 NULL,则表示无效输入。例如,在此脚本中
CREATE TABLE T(a int, b real, c as getdate(), d as a+b)
CREATE VIEW VT WITH SCHEMABINDING AS SELECT a, b, c, d FROM dbo.T
SELECT object_id('VT'), COLUMNPROPERTY(object_id('VT'),'b','IsPrecise')
SELECT 对 IsPrecise 返回 0,因为 b 列为实型。可通过 COLUMNPROPERTY 做一些实验,确认 T 的其他列是否具有确定性并是精确的。
其他要求
可索引的视图集合是可能的视图集合的一个子集。任何可索引的视图在有或没有索引的情况下都可存在。
除了设计方针(“使用 SET 选项获得一致的结果”和“使用具有确定性的函数”这两节)中所列的要求外,还必须满足下列要求,以便在视图上创建唯一的聚集索引。
有关基表的要求
| • |
视图所引用的基表必须具有在创建表时所设的 SET 选项 ANSI_NULLS 的正确的值。可用 OBJECTPROPERTY 函数检查现有表上的 ANSI_NULLS 的值。 |
有关函数的要求
| • |
必须使用 WITH SCHEMABINDING 选项创建视图所引用的用户定义的函数。 |
有关视图的要求
| • |
必须使用 WITH SCHEMABINDING 选项创建视图。 |
| • |
必须由使用双结构名称 (schemaname.tablename) 的视图引用表。 |
| • |
必须由使用双结构名称 (schemaname.functionname) 的视图引用用户定义的函数。 |
| • |
必须正确设置 SET 选项 ANSI_NULLS 和 QUOTED_IDENTIFIER。 |
视图限制
如要在 SQL Server 2005 中的视图上创建一个索引,相应的视图定义必须包含:
|
ANY、NOT ANY |
OPENROWSET、OPENQUERY、OPENDATASOURCE |
|
不精确的(浮型、实型)值上的算术 |
OPENXML |
|
COMPUTE、COMPUTE BY |
ORDER BY |
|
CONVERT 生成一个不精确的结果 |
OUTER 联接 |
|
COUNT(*) |
引用带有一个已禁用的聚集索引的基表 |
|
GROUP BY ALL |
引用不同数据库中的表或函数 |
|
派生的表(FROM 列表中的子查询) |
引用另一个视图 |
|
DISTINCT |
ROWSET 函数 |
|
EXISTS、NOT EXISTS |
自联接 |
|
聚合结果(比如:SUM(x)+SUM(x))上的表达式 |
STDEV、STDEVP、VAR、VARP、AVG |
|
全文谓词 (CONTAINS、FREETEXT、CONTAINSTABLE、FREETEXTTABLE) |
子查询 |
|
不精确的常量(比如:2.34e5) |
可为空的表达式上的 SUM |
|
内嵌或表值函数 |
表提示(比如:NOLOCK) |
|
MIN、MAX |
text、ntext、image、filestream 或 XML 列 |
|
不具有确定性的表达式 |
TOP |
|
非 unicode 排序 |
UNION |
|
SQL Server 2005 可检测到的矛盾情况表示视图将为空(比如,当 0=1 及 ...) |
|
编辑:xker.com