无法模式绑定函数函数,因为它引用了系统对象'sys.extended_properties'

时间:2014-01-24 15:50:00

标签: sql sql-server

我想创建一个Indexed View,其中我使用了一个名为GetBranchId的函数。

据我所知,为了创建Indexed View,我们还必须使用SchemaBinding创建使用过的函数。但问题是,当我想改变我的功能时,我得到了这个错误:

  

无法模式绑定函数'dbo.GetBranchId',因为它引用了   系统对象'sys.extended_properties'

这是我的功能:

ALTER FUNCTION [dbo].[GetBranchId] 
(
)
RETURNS smallint with schemabinding
AS
BEGIN
    RETURN (SELECT TOP 1 CAST(value as smallint) 
     FROM sys.extended_properties Where class = 0 and name = 'BranchId')
END

1 个答案:

答案 0 :(得分:1)

所以,假设您有一个索引视图(不是“索引视图”),如下所示:

CREATE VIEW dbo.IndexedView
WITH SCHEMABINDING
AS
    SELECT ...
GO
CREATE UNIQUE CLUSTERED INDEX x ON dbo.IndexedView(...);
GO

如果要向该视图添加一个代表此函数的列(从目录视图中提取数据),则不能使用SCHEMABINDING,如您所知。所以只需创建一个不同的视图,例如:

CREATE VIEW dbo.NonIndexedView
AS
  SELECT iv.col1, iv.col2, BranchId = dbo.GetBranchId()
    FROM dbo.IndexedView;

然而,正如我在评论中所提到的,我没有看到这一点。由于这将为视图中的每一行返回单个值,为什么不只是获取一次值,将其存储在变量中,并在查询视图的最终查询中返回它?

相关问题