您需要声明用户定义函数WITH SCHEMABINDING
来满足计算列上索引的“确定性”要求。
声明的函数WITH SCHEMABINDING
将保留有关函数中使用的对象依赖关系的额外知识(例如表中的列),并将防止对这些列进行任何更改,除非函数本身被预先删除。
确定性函数还可以帮助 Sql Server 优化其执行计划,尤其是万圣节保护问题。
下面是使用模式绑定函数在计算列上创建索引的示例:
create function [dbo].[FullNameLastFirst]
(
@IsPerson bit,
@LastName nvarchar(100),
@FirstName nvarchar(100)
)
returns nvarchar(201)
with schemabinding
as
begin
declare @Result nvarchar(201)
set @Result = (case when @IsPerson = 0 then @LastName
else case when @FirstName = '' then @LastName
else (@LastName + ' ' + @FirstName) end end)
return @Result
end
create table Person
(
isperson bit,
lastname nvarchar(100),
firstname nvarchar(100),
fullname as [dbo].[FullNameLastFirst] (isperson, lastname, firstname)
)
go
insert into person(isperson, lastname, firstname) values (1,'Firstname', 'Surname')
go
create index ix1_person on person(fullname)
go
select fullname from Person with (index=ix1_person) where fullname = 'Firstname Surname'
go