创建索引视图,该视图引用非索引视图和来自多个DB的对象

时间:2014-04-04 21:07:15

标签: sql sql-server-2008 tsql sql-server-2012

我在create view语句中使用以下格式的以下对象。

dbo.objects1 A
INNER JOIN db2.dbo.object2 
INNER JOIN db2.dbo.object3 
INNER JOIN db2.dbo.object4
INNER JOIN db2.dbo.object5

objects1Database1中包含索引的表格。 objects2 through objects5位于另一个database中,所有这4个对象都以No indexes进行查看。

现在我正在尝试使用以上所有五个对象创建一个索引视图,但SQL服务器不允许我。

第一个错误是:

Names must be in two-part format and an object cannot reference itself.

第二个错误是:

Cannot schema bind view 'dbo.vw_Order' because name 'db2.dbo.object2' is invalid for schema binding.

现在我搜索了这些错误,我开始遵循以下假设:

  1. 视图不能包含连接查询中多个数据库中的对象。
  2. 为了在视图上创建索引,视图中的所有对象都应该具有索引或应该是模式绑定的(如函数)。
  3. 当我像查询一样运行视图时,执行计划建议我在db2中的对象的列上创建索引。如果我的假设是正确的,请告诉我。如果没有,请告诉我如何在这种情况下创建视图。

3 个答案:

答案 0 :(得分:17)

正如您已经完成的研究,索引视图定义中的所有对象(表/视图)必须具有TWO PART名称即[Schema].[Object],这意味着所有对象都将位于一个数据库中并且您无法跨多个数据库创建索引视图。索引视图有很多限制,如果可能,请考虑创建存储过程

您获得的其他错误是您在视图的定义中缺少WITH SCHEMABINDING选项。创建索引视图时必须要求创建索引视图时必须使用WITH SCHEMABINDING选项,即在删除此视图之前,不能更改任何基础表/对象模式。

我再次建议查看存储过程,因为在您的情况下创建索引视图似乎是不可能的,因为它带来了所有限制。

答案 1 :(得分:8)

将所有者添加到视图名称和表中。 像:

Create VIEW dbo.MyView
WITH SCHEMABINDING
    AS
    SELECT * From dbo.Users

答案 2 :(得分:2)

您无法使用不同数据库的两个对象创建索引视图。