我想创建一个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
答案 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;
然而,正如我在评论中所提到的,我没有看到这一点。由于这将为视图中的每一行返回单个值,为什么不只是获取一次值,将其存储在变量中,并在查询视图的最终查询中返回它?