1 用户自定义函数的确给我们带来了很多方便。使代码更简洁和易读。
2 自定义函数用户视图,使 View 的书写更简单。
3 但是,如果用户自定义函数是通过检索表而得到返回值的情况时,千万就不要使用到视图中了。
原因:对视图进行查询的时候,SQLServer 的机制是,每查询到一行数据,都重新执行这个用户自定义函数,即要去多某表进行检索而得出结果。
如果视图的主题表有 1000 行,而函数里面检索的表有 1000 行,那么函数总共要执行 1000 * 1000 次检索任务。特别是检索的字段没有建立索引时,将会是“崩溃”性的结果。
V_UserDetails:
select F_GetUserName(ID), * from T_Users
F_GetUserName(@ID int)
{
declare @Name varchar(50)
select @Name = [Name] from T_OldUsers where [ID] = @ID
return @Name
}
以上函数和视图,在有 100000 条记录时,将执行 100000 * 100000 次检索。
4 解决以上(3) 的办法是:先将 Name 字段通过级联查询出中间表,再将中间表与视图的主题标进行级联。
5 如果用户自定义函数中没有使用检索表,而只是计算:
F_GetResult(@a int, @b int)
{
return @a * @b;
}
那么就另当别论了。随意使用