【问题标题】:How to create a indexed view with tables from 2 different databases using Schemabinding如何使用 Schemabinding 创建包含来自 2 个不同数据库的表的索引视图
【发布时间】:2014-12-06 00:37:48
【问题描述】:

这是难题...

我在同一个 SQL Server 2008 R2 实例上有 2 个数据库。

DB-One 用于网站,DB-two 是每天从转储中更新的数据。

现在我想在 DB-One 上创建一个索引视图,我在其中引用来自 DB 2 的 2 个表。

所以我的查询类似于

SELECT 
    TBA.COLA, TBB.COlA
FROM 
    DB-ONE.TBA.COLA A
JOIN 
    DB-TWO.TBB.COLA B ON (A.Id= B.Id)

现在这个查询工作正常,很明显......但是,如果我尝试使用以下语法创建一个视图,它会给我一个错误

CREATE VIEW TESTVIEW WITH SCHEMABINDING AS

错误:

无法架构绑定视图“TESTVIEW”,因为名称“DB-ONE.TBA.COLA A”对于架构绑定无效。名称必须采用两部分格式,并且对象不能引用自身。

如果这种方法不可行,那么任何人都可以提出任何替代方案吗?

【问题讨论】:

  • 在索引视图中,您不能引用另一个数据库中的表...
  • 好的。你能推荐一个替代方案吗?
  • 一种替代方法是安排一个计划的 ETL 作业,将视图数据保存在两个数据库之一的表中,根据需要对该表进行索引,然后安排 ETL 在每日“数据”之后加载转储”。
  • 也许我要求太多了。但是你能用一个小例子写一个简短的答案,说明我将如何做到这一点

标签: sql sql-server sql-server-2008-r2


【解决方案1】:

如错误消息中所述,使用架构绑定时“名称必须采用两部分格式”,这意味着它们必须采用 [schema].[tablename] 格式,因此表不能位于 2 个单独的数据库中。

  • 选项 1:有一个计划的 ETL 作业,将视图数据保存在 Db-One 中的一个表中,根据需要为该表建立索引,然后安排 ETL 在每日“数据转储”之后加载。

运行一次

USE [DB-ONE]
GO
CREATE TABLE dbo.myReport(/*column structure of your indexed view goes here*/);
go
--index table as needed
go

然后安排在每日“数据转储”加载到 DB-TWO 后从 DB-ONE 运行:

use [DB-ONE]
GO
insert into dbo.myReport(/*list of columns*/)
SELECT TBA.COLA, TBB.COlA
FROM DB-ONE.TBA.COLA A
JOIN DB-TWO.TBB.COLA B ON (A.Id= B.Id)
;
  • 选项 2:您可以将 DB-TWO 表中的所有数据复制到 DB-ONE 中,然后仍然在 DB-ONE 表上创建索引视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多