opa*_*era 31 sql function calculated-columns non-deterministic sql-server-2008
我有以下用户定义的函数:
create function [dbo].[FullNameLastFirst]
(
@IsPerson bit,
@LastName nvarchar(100),
@FirstName nvarchar(100)
)
returns nvarchar(201)
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
Run Code Online (Sandbox Code Playgroud)
我无法使用此函数在计算列上创建索引,因为它不是确定性的.有人可以解释为什么它不是确定性的,最终如何修改以使其具有确定性?谢谢
Mar*_*ith 48
你只需要创建它with schemabinding.
然后SQL Server将验证是否满足被认为是确定的标准(其它,因为它不访问任何外部表或使用非确定性的函数,如getdate()).
您可以验证它是否有效
SELECT OBJECTPROPERTY(OBJECT_ID('[dbo].[FullNameLastFirst]'), 'IsDeterministic')
Run Code Online (Sandbox Code Playgroud)
将schemabinding选项添加到原始代码可以正常工作,但稍微简单一点的版本.
CREATE FUNCTION [dbo].[FullNameLastFirst] (@IsPerson BIT,
@LastName NVARCHAR(100),
@FirstName NVARCHAR(100))
RETURNS NVARCHAR(201)
WITH SCHEMABINDING
AS
BEGIN
RETURN CASE
WHEN @IsPerson = 0
OR @FirstName = '' THEN @LastName
ELSE @LastName + ' ' + @FirstName
END
END
Run Code Online (Sandbox Code Playgroud)
您需要声明用户定义函数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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15506 次 |
| 最近记录: |