【问题标题】:SQL Server Materialized View (Indexed View) errorSQL Server 实体化视图(索引视图)错误
【发布时间】:2019-05-26 21:23:18
【问题描述】:

我正在尝试使用 Microsoft SQL Server Management Studio 14.0.17285.0 创建实体化视图。以下是我最终实现相同目的的脚本。

我的计划是创建一个视图并在其上创建一个索引。

use data_warehouse;

--Set the options to support indexed views.  
    SET NUMERIC_ROUNDABORT OFF;  
    SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,  
        QUOTED_IDENTIFIER, ANSI_NULLS ON;
    GO

CREATE VIEW products_yearly_v2
WITH SCHEMABINDING 
AS
    SELECT  
        p.product_id AS product_id, 
        p.product_description AS product_name,
        d.order_year AS order_year,  
        SUM(s.order_total) AS sal_by_dept
    FROM   
        [data_warehouse].[dbo].orders_fact AS s
    INNER JOIN 
        [data_warehouse].[dbo].time_dimension AS d ON s.time_id = d.order_date
    INNER JOIN 
        [data_warehouse].[dbo].product_dimension AS p ON s.product_id = p.product_id
    GROUP BY 
        d.order_year, p.product_id, p.product_description;

CREATE UNIQUE CLUSTERED INDEX IDX_V1   
    ON products_yearly_v1 (order_year, product_id);

我收到此错误:

消息 156,级别 15,状态 1,程序 products_yearly_v2,第 12 行 [批处理开始第 7 行]
关键字“CREATE”附近的语法不正确

更新 添加了 COUNT_BIG(*) 以创建索引。

SELECT  COUNT_BIG(*) as count_big, p.product_id as product_id, d.order_year as order_year,  sum(s.order_total) AS sal_by_dept ....

GROUP BY

中删除了 product_description
GROUP BY d.order_year,p.product_id;

已阅读,

USE data_warehouse

【问题讨论】:

    标签: sql-server tsql view materialized-views


    【解决方案1】:

    您需要使用两部分名称:

    SCHEMABINDING

    将视图绑定到基础表的架构。指定 SCHEMABINDING 时,不能以会影响视图定义的方式修改一个或多个基表。必须首先修改或删除视图定义本身,以删除对要修改的表的依赖关系。 当您使用 SCHEMABINDING 时,select_statement 必须包含引用的表、视图或用户定义函数的两部分名称 (schema.object)。所有引用的对象必须在同一个数据库中。

    USE data_warehouse
    GO
    
    CREATE VIEW dbo.products_yearly_v2
    WITH SCHEMABINDING 
    AS 
    SELECT  
        p.product_id AS product_id, 
        p.product_description AS product_name,
        d.order_year AS order_year,  
        SUM(s.order_total) AS sal_by_dept
    FROM [dbo].orders_fact AS s
    JOIN [dbo].time_dimension AS d ON s.time_id = d.order_date
    JOIN [dbo].product_dimension AS p ON s.product_id = p.product_id
    GROUP BY d.order_year, p.product_id, p.product_description;
    GO
    
    -- index on products_yearly_v2 not products_yearly_v1
    CREATE UNIQUE CLUSTERED INDEX IDX_V2
       ON dbo.products_yearly_v2 (order_year, product_id);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 2012-03-01
      • 2011-02-16
      • 2011-07-16
      • 2010-11-04
      • 2013-04-25
      • 2012-02-18
      相关资源
      最近更新 更多