我有一个表TableA
,其计算列FieldA
绑定到一个返回浮点数的函数。函数是GetFieldA
,它调用两个子函数。
我还有一个视图,其中包含GetFieldA
函数而不是计算列值作为字段。我只是尝试向视图添加一个索引,该索引表示需要GetFieldA
进行模式绑定才能在其上建立索引,我将其更改为模式绑定(包括删除计算列)但是我回去尝试读取它所说的计算列,以便使用GetFieldA
必须删除模式绑定。
有没有办法让计算列具有模式绑定功能,或者我是否需要重新设计如何获取该字段以便能够拥有视图索引?
答案 0 :(得分:1)
在计算列上添加索引是不可能的,除非它是确定性的。
“确定性函数在使用一组特定的输入值调用它们并且给定相同的数据库状态时,总是返回相同的结果。每次使用特定的集合调用时,非确定性函数可能会返回不同的结果输入值即使他们访问的数据库状态保持不变。“
示例:
CREATE FUNCTION dbo.FuncA()
RETURNS [float]
WITH SCHEMABINDING -- required option
BEGIN
RETURN 1.0 -- DB engine parses body, and marks this func. as 'deterministic'
END
GO
CREATE TABLE TableA (
K int primary key clustered,
A AS dbo.FuncA() PERSISTED -- must be persisted
)
GO
CREATE VIEW ViewA
WITH SCHEMABINDING -- required option
AS
SELECT K, A FROM dbo.TableA
GO
CREATE UNIQUE CLUSTERED INDEX IDX1 ON dbo.ViewA (K, A)
GO
您必须为PERSISTED
和[real]
之类的不精确数据类型指定[float]
,在其他情况下,您可以在具有计算列的视图上自由创建索引([decimal]将是行)。