SQLServer之函数简介
⽤户定义函数定义
与编程语⾔中的函数类似,SQL Server ⽤户定义函数是接受参数、执⾏操作(例如复杂计算)并将操作结果以值的形式返回的例程。返回值可以是单个标量值或结果集。
⽤户定义函数准则
在函数中,将会区别处理导致语句被取消并继续执⾏模块(如触发器或存储过程)中的下⼀个语句的 Transact-SQL 错误。在函数中,上述错误会导致停⽌执⾏函数。接下来该操作导致取
消调⽤该函数的语句。
部对象(如局部游标或局部变量)的更改。不能在函数中执⾏的操作包括:对数据库表的修改,对不在函数上的局部游标进⾏操作,发送电⼦邮件,尝试修改⽬录,以及⽣成返回⾄⽤户的
结果集。
如果 CREATE FUNCTION 语句对在发出 CREATE FUNCTION 语句时不存在的资源产⽣副作⽤,SQL Server 将执⾏该语句。但在调⽤函数时, SQL Server 不执⾏此函数。
在查询中指定的函数的实际执⾏次数在优化器⽣成的执⾏计划间可能不同。⽰例为 WHERE ⼦句中的⼦查询调⽤的函数。⼦查询及其函数执⾏的次数会因优化器选择的访问路径的不同⽽
异。
⽤户定义函数分类
标量函数
⽤户定义标量函数返回在 RETURNS ⼦句中定义的类型的单个数据值。对于内联标量函数,没有函数体;标量值是单个语句的结果。对于多语句标量函数,定义在 END 块中的函
数体包含⼀系列返回单个值的 Transact-SQL 语句。返回类型可以是任何数据类型除外text, ntext, image, cursor,和timestamp。
表值函数
sqlserver备份表语句⽤户定义表值函数返回table数据类型。对于内联表值函数,没有函数主体;表是单个 SELECT 语句的结果集。
系统函数
SQL Server 提供了许多系统函数,可⽤于执⾏各种操作。这些函数不能修改。有关详细信息,请参阅内置函数 (Transact-SQL)、系统存储函数 (Transact-SQL) 和动态管理视图
和函数 (Transact-SQL)。
内置函数
聚合函数
聚合函数对⼀组值执⾏计算,并返回单个值。在 select 列表或 SELECT 语句的 HAVING ⼦句中允许使⽤它们。可以将聚合与 GROUP BY ⼦句结合使⽤,来计算⾏类别的聚合。
使⽤ OVER ⼦句来计算特定范围内的值的聚合。 OVER ⼦句不能跟在 GROUPING 或 GROUPING_ID 聚合后。
聚合函数对⼀组值执⾏计算,并返回单个值。除了 COUNT 外,聚合函数都会忽略 Null 值。
所有聚合函数均为确定性函数。换⾔之,每次使⽤⼀组特定的输⼊值调⽤聚合函数时,它们所返回的值都是相同的。有关函数确定性的详细信息,请参阅确定性函数和不确定性函数。
只能在以下位置将聚合函数作为表达式使⽤:
SELECT 语句的选择列表(⼦查询或外部查询)。
HAVING ⼦句。
分析函数
解析函数基于⼀组⾏计算聚合值。不过,与聚合函数不同,分析函数可能针对每个组返回多⾏。可以使⽤分析函数来计算移动平均线、运⾏总计、百分⽐或⼀个组内的前 N 个结果。
排名函数
排名函数为分区中的每⼀⾏返回⼀个排名值。根据所⽤函数的不同,某些⾏可能与其他⾏接收到相同的值。排名函数具有不确定性。
⾏集函数
⾏集函数返回可在 SQL 语句中像表引⽤⼀样使⽤的对象。
标量函数
对单⼀值进⾏运算,然后返回单⼀值。只要表达式有效,即可使⽤标量函数。
系统存储函数
SQL Server 提供了以下组的系统函数:Always On 可⽤性组函数、变更数据捕获函数、更改跟踪函数、据收集器函数、Filestream 和 FileTable 函数、托管备份函
数、sys.fn_get_sql、sys.fn_MSxe_read_event_stream、sys.fn_stmt_sql_handle_from_sql_stmt、sys.fn_validate_plan_guide、sys.fn_xe_file_target_read_file、sys.fn_backup_file_snapshots、义全⽂搜索函数、系统元数据函数、系统安全函数、系统跟踪函数。
动态管理视图函数
动态管理视图和函数返回可⽤于监视服务器实例的运⾏状况、诊断故障以及优化性能的服务器状态信息。
动态管理视图和函数分为两种类型:
服务器范围内的动态管理视图和函数。此类型需要具有该服务器的 VIEW SERVER STATE 权限。
数据库范围内的动态管理视图和函数。此类型需要具有该数据库的 VIEW DATABASE STATE 权限。
⽤户定义函数输⼊
⽤户定义函数采⽤零个或多个输⼊参数并返回标量值或表。⼀个函数最多可以有 1024 个输⼊参数。如果函数的参数有默认值,则调⽤该函数时必须指定 DEFAULT 关键字,才能获取默认
值。此⾏为与在⽤户定义存储过程中具有默认值的参数不同,在后⼀种情况下,忽略参数同样意味着使⽤默认值。
⽤户定义函数输出
⽤户定义函数不⽀持输出参数。
标量函数返回的是⼀个数据类型值。
内联表值函数返回的是⼀个table。
系统函数⽤户执⾏指定操作,可以返回数据类型值或者table。
⽤户⾃定义函数应⽤场景
具有重复代码、功能和代码块的地⽅,应使⽤函数以使代码具有更好的可维护性、可重⽤性和更少的复杂性。
需要对表中数据进⾏简单处理,例如数学计算时可以考虑使⽤函数。
只有查询功能时应优先考虑视图,包含查询和其他操作的应优先考虑函数。
⽤户⾃定义函数优点
在 SQL Server 中使⽤⽤户定义函数有以下优点:
允许模块化程序设计。
只需创建⼀次函数并将其存储在数据库中,以后便可以在程序中调⽤任意次。⽤户定义函数可以独⽴于程序源代码进⾏修改。
执⾏速度更快。
与存储过程相似,Transact-SQL ⽤户定义函数通过缓存计划并在重复执⾏时重⽤它来降低 Transact-S
QL 代码的编译开销。这意味着每次使⽤⽤户定义函数时均⽆需重新解析和重新优化,从⽽缩短了执⾏时间。
和⽤于计算任务、字符串操作和业务逻辑的 Transact-SQL 函数相⽐,CLR 函数具有显著的性能优势。 Transact-SQL 函数更适⽤于数据访问密集型逻辑。
减少⽹络流量。
基于某种⽆法⽤单⼀标量的表达式表⽰的复杂约束来过滤数据的操作,可以表⽰为函数。然后,此函数便可以在 WHERE ⼦句中调⽤,以减少发送⾄客户端的数字或⾏数。
查询中的 Transact-SQL ⽤户定义函数只能针对单个线程执⾏(串⾏执⾏计划)。
⽤户⾃定义函数缺点
⽤户⾃定义函数不能⽤于执⾏⼀系列改变数据库状态的操作。
⽤户定义函数不能包含将表作为其⽬标的 OUTPUT INTO ⼦句。
能在函数中使⽤的语句有严格限制:
不⽀持create、ALTER、drop等DDL(Data Definition Language)命令。
insert、delete、update只能⽤在临时表上。
不⽀持动态SQL。
不⽀持“不确定”的函数,⽐如常⽤的getdate。不确定函数是指输⼊参数相同,返回结果可能不同的函数。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论