如何将架构绑定添加到 SQL Server 2008 中的视图

Posted

技术标签:

【中文标题】如何将架构绑定添加到 SQL Server 2008 中的视图【英文标题】:How to add schema binding to a view in SQL Server 2008 【发布时间】:2014-02-01 10:26:26 【问题描述】:

我正在尝试在我的 SQL Server 2008 数据库中创建索引。

但是当我取消注释 WITH SCHEMABINDING 时遇到错误:

USE UNIVERSITY
GO

CREATE VIEW dbo.Major_Education_Category
WITH SCHEMABINDING
AS
   SELECT CA.CName, MA.MName
   FROM 
     (SELECT M.Major_ID MID , Major_Name MName
      FROM Major M, Registration R
      WHERE M.Major_ID = R.Major_ID) MA,
     (SELECT C.Category_ID CId, C.Category_Name CName
      FROM Education_Category C, Registration R
      WHERE C.Category_ID = R.Category_ID) CA
   GROUP BY 
      CA.CName, MA.MName

CREATE UNIQUE CLUSTERED INDEX UCI_Major_Id_By_Education_Category
ON dbo.Major_Education_Category (MName)
GO

CREATE UNIQUE CLUSTERED INDEX UCI_Category_Id_By_Major
ON dbo.Major_Education_Category  (CName)
GO

错误:

消息 4512,级别 16,状态 3,程序 Major_Education_Category,第 6 行 无法架构绑定视图“dbo.Major_Education_Category”,因为名称“Major”对于架构绑定无效。名称必须采用两部分格式,并且对象不能引用自身。

【问题讨论】:

Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已随 ANSI-92 SQL 标准(超过 20 年前) 为什么要交叉连接派生表MACA 【参考方案1】:

需要将 from 子句中的表指定为两部分 owner.tablename。除非您知道,否则这很可能是dbo。所以试试dbo.Majordbo.Registration等。

【讨论】:

【参考方案2】:

把 dbo.TableName。 更改为:

(SELECT M.Major_ID MID , Major_Name MName
    FROM dbo.Major M, dbo.Registration R
    WHERE M.Major_ID = R.Major_ID) MA,
(SELECT C.Category_ID CId, C.Category_Name CName
    FROM dbo.Education_Category C, dbo.Registration R
    WHERE C.Category_ID = R.Category_ID) CA

【讨论】:

以上是关于如何将架构绑定添加到 SQL Server 2008 中的视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将中断视图添加到 Visual Studio SQL Server 数据库项目

在 SQL Server 中的架构绑定视图上创建索引

将 .NET 类型映射到 SQL Server 200 数据类型

无法架构绑定 sql server 视图

SQL server 数据库 如何把一张表复制到另一个数据库表中

SQL Server - 使用当前 GetDate 筛选器创建架构绑定索引视图