Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建引用非索引视图和来自多个DB的对象的索引视图';s_Sql_Sql Server 2008_Tsql_Sql Server 2012 - Fatal编程技术网

Sql 创建引用非索引视图和来自多个DB的对象的索引视图';s

Sql 创建引用非索引视图和来自多个DB的对象的索引视图';s,sql,sql-server-2008,tsql,sql-server-2012,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 objects1是来自Database1的一个具有索引的表。objects2到objects5位于另一个数据库中,并且所有这4个对象都是在无索引的情况下查看的 现在我正试图创建一个包含上述五个对

我在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
objects1
是来自
Database1
的一个具有索引的表。
objects2到objects5
位于另一个
数据库中
,并且所有这4个对象都是在
无索引的情况下查看的

现在我正试图创建一个包含上述五个对象的索引视图,但SQL server不允许我这样做

第一个错误是:

名称必须采用两部分格式,并且对象不能引用自身。

第二个错误是:

无法模式绑定视图“dbo.vw_Order”,因为名称“db2.dbo.object2”对模式绑定无效。

现在我在谷歌上搜索这些错误,得出以下假设:

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

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

    您得到的另一个错误是在视图的定义中缺少带有SCHEMABINDING的
    选项。创建索引视图时必须使用WITH SCHEMABINDING选项,这是创建索引视图的一个必要条件,即在删除此视图之前,不能更改任何基础表/对象架构


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

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

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


    我认为SQL提供了一些灵活性,但我没有意识到。但随着我对你的回答进行更多的研究,这似乎是观点的局限性之一。我想创建一个索引视图(并在一个进程中使用它)是因为一个ScPRC不会有很大的帮助,因为查询占用1个小时来运行,而一个SpROC可能仅仅通过几个分钟来改善运行时间。一个小时WOW,然后考虑一些模式修改,将表移动到一个数据库(如果可能的话)。或者至少在数据库中的一个或两个表中获取所需的数据,其中大部分数据都在其中,并尝试稍微对数据进行非规范化。索引视图听起来很方便,但我被告知它们只是为了击败某些TPC基准而构建的,实际上它们太有限,无法使用。您是否尝试过优化现有查询?如果运行需要一个小时,那么无论如何构建索引视图也需要一个小时。
    Create VIEW dbo.MyView
    WITH SCHEMABINDING
        AS
        SELECT * From dbo.Users