对索引视图的限制
定义索引视图的 SELECT 语句不得包含 TOP、DISTINCT、COMPUTE、HAVING 和 UNION 关键字。也不能包含子查询。SELECT 列表中不得包含星号 (*)、'table.*' 通配符列表、DISTINCT、COUNT(*)、COUNT(<expression>)、基表中的计算列和标量聚合。 非聚合 SELECT 列表中不能包含表达式。聚合 SELECT 列表(包含 GROUP BY 的查询)中可能包含 SUM 和 COUNT_BIG(<expression>);它一定包含 COUNT_BIG(*)。不允许有其它聚合函数(MIN、MAX、STDEV,...)。使用 AVG 的复杂聚合无法参与索引视图的 SELECT 列表。不过,如果查询使用这样的聚合,则优化程序将能使用该索引视图,用 SUM 和 COUNT_BIG 的简单聚合组合代替 AVG。若某列是从取值为 float 数据类型或使用 float 表达式进行取值的表达式得到的,则不能作为索引视图或表中计算列的索引键。这样的列被视为是不精确的。使用 COLUMNPROPERTY 函数决定特定计算列或视图中的列是否精确。索引视图受限于以下的附加限制: 索引的创建者必须拥有表。所有表、视图和索引必须在同一数据库中创建。
定义索引视图的 SELECT 语句不得包含视图、行集函数、行内函数或派生表。同一物理表在该语句中只能出现一次。
在任何联接表中,均不允许进行 OUTER JOIN 操作。
搜索条件中不允许使用子查询或者 CONTAINS 或 FREETEXT 谓词。
如果视图定义包含 GROUP BY 子句,则视图的 SELECT 列表中必须包含所有分组依据列及 COUNT_BIG(*) 表达式。此外,CREATE UNIQUE CLUSTERED INDEX 子句中必须只包含这些列。 
可以创建索引的视图的定义主体必须具有确定性且必须精确,这类似于计算列上的索引要求。请参见在计算列上创建索引。

解决方案 »

  1.   

    txlicenhe(马可) :是不是不能用*及DISTINCT???可是我的语句非得用DISTINCT啊,要不怎么办呢?
      

  2.   

    如果用distinct就不能建索引,如果要建索引就不能用distinct
      

  3.   

    我的代码为最简单的就是刚才的:create view xg as select xm,xh,lxdh,txdz from bkk 
    然后:create index xh_index on xg(xh)还是会出现上述错误的
    大力,看看吧
      

  4.   

    这种问题你应该多看看SQL Server中的帮助,里面讲得很详细的。
      

  5.   

    楼上的哥哥们,当然我的查询不会那么简单,用了二十个LEFT JOIN 连接的查询,如果不要索引,慢死了,上面的我只是举个简单的例子说明  这么简单的视图也不能创建!!!!!!!!!
      

  6.   

    你用函数吧,如:CREATE FUNCTION fn_CustomerNamesInRegion
                     ( @RegionParameter nvarchar(30) )
    RETURNS table
    AS
    RETURN (
            SELECT CustomerID, CompanyName
            FROM Northwind.dbo.Customers
            WHERE Region = @RegionParameter
           )
    GO
    -- Example of calling the function for a specific region
    SELECT *
    FROM fn_CustomerNamesInRegion(N'WA')
    GO
    这样你把你要的where写在里面,就可以完全使用表的索引,而不需要另外的索引。
      

  7.   

    大力哥啊我想在VB里创建视图并且要利用该视图的索引来查询
    本来以前是做暑临时表的,可是每次启动都要生成临时表,这让程序变慢了,虽然能加快查询的速度,但是程序太慢了啊?大力,你的函数可以在VB里执行SQL语句的时候用吗?
    如果实在没有办法了,我也只好在用用您的办法了
      

  8.   

    SCHEMABINDING将视图绑定到架构上。指定 SCHEMABINDING 时,select_statement 必须包含所引用的表、视图或用户定义函数的两部分名称 (owner.object)。不能除去参与用架构绑定子句创建的视图中的表或视图,除非该视图已被除去或更改,不再具有架构绑定。否则,SQL Server 会产生错误。另外,如果对参与具有架构绑定的视图的表执行 ALTER TABLE 语句,而这些语句又会影响该架构绑定视图的定义,则这些语句将会失败。
      

  9.   

    你的函数可以在VB里执行SQL语句的时候用吗?可以,它相当于参数视图,你把它当表看,不过它要接参数
      

  10.   

    怎么来指定二楼上那位所说的指定 SCHEMABINDING  呢?