SQLServer之函数简介
用户定义函数定义
与编程语言中的函数类似,SQL Server 用户定义函数是接受参数、执行操作(例如复杂计算)并将操作结果以值的形式返回的例程。 返回值可以是单个标量值或结果集。
用户定义函数准则
在函数中,将会区别处理导致语句被取消并继续执行模块(如触发器或存储过程)中的下一个语句的 Transact-SQL 错误。 在函数中,上述错误会导致停止执行函数。 接下来该操作导致取消调用该函数的语句。
BEGIN...END 块中的语句不能有任何副作用。 函数副作用是指对具有函数外作用域(例如数据库表的修改)的资源状态的任何永久性更改。 函数中的语句唯一能做的更改是对函数上的局部对象(如局部游标或局部变量)的更改。 不能在函数中执行的操作包括:对数据库表的修改,对不在函数上的局部游标进行操作,发送电子邮件,尝试修改目录,以及生成返回至用户的结果集。
如果 CREATE FUNCTION 语句对在发出 CREATE FUNCTION 语句时不存在的资源产生副作用,SQL Server 将执行该语句。 但在调用函数时, SQL Server 不执行此函数。
在查询中指定的函数的实际执行次数在优化器生成的执行计划间可能不同。 示例为 WHERE 子句中的子查询调用的函数。 子查询及其函数执行的次数会因优化器选择的访问路径的不同而异。
用户定义函数分类
标量函数
用户定义标量函数返回在 RETURNS 子句中定义的类型的单个数据值。 对于内联标量函数,没有函数体;标量值是单个语句的结果。 对于多语句标量函数,定义在 BEGIN...END 块中的函数体包含一系列返回单个值的 Transact-SQL 语句。 返回类型可以是任何数据类型除外text, ntext, image, cursor,和timestamp。
表值函数
用户定义表值函数返回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-SQL 代码的编译开销。这意味着每次使用用户定义函数时均无需重新解析和重新优化,从而缩短了执行时间。
和用于计算任务、字符串操作和业务逻辑的 Transact-SQL 函数相比,CLR 函数具有显著的性能优势。 Transact-SQL 函数更适用于数据访问密集型逻辑。
减少网络流量。
基于某种无法用单一标量的表达式表示的复杂约束来过滤数据的操作,可以表示为函数。 然后,此函数便可以在 WHERE 子句中调用,以减少发送至客户端的数字或行数。
- 查询中的 Transact-SQL 用户定义函数只能针对单个线程执行(串行执行计划)。
用户自定义函数缺点
用户自定义函数不能用于执行一系列改变数据库状态的操作。
用户定义函数不能包含将表作为其目标的 OUTPUT INTO 子句。
能在函数中使用的语句有严格限制:
- 不支持create、ALTER、drop等DDL(Data Definition Language)命令。
- insert、delete、update只能用在临时表上。
- 不支持动态SQL。
- 不支持“不确定”的函数,比如常用的getdate。不确定函数是指输入参数相同,返回结果可能不同的函数。
SQLServer之函数简介的更多相关文章
- MSSQL sqlserver系统函数教程分享
摘要: 下文收集了sqlserver函数教程,为每一个函数都进行了相关举例说明, 如下所示: sqlserver聚合函数教程: mssql sqlserver avg聚合函数使用简介 mssql sq ...
- linux进程编程:子进程创建及执行函数简介
linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system(); 下面分别做详细介绍.(1)fork() 函数定 ...
- Linux Shell系列教程之(十五) Shell函数简介
本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...
- 【液晶模块系列基础视频】4.5.X-GUI图形界面库-进度条等函数简介
[液晶模块系列基础视频]4.5.X-GUI图形界面库-进度条等函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址 ...
- 【液晶模块系列基础视频】4.4.X-GUI图形界面库-画tab函数简介
[液晶模块系列基础视频]4.4.X-GUI图形界面库-画tab函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址 ...
- 【液晶模块系列基础视频】4.3.X-GUI图形界面库-画box函数简介
[液晶模块系列基础视频]4.3.X-GUI图形界面库-画box函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址 ...
- 【液晶模块系列基础视频】4.2.X-GUI图形界面库-画矩形函数简介
[液晶模块系列基础视频]4.2.X-GUI图形界面库-画矩形函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址: ...
- 【液晶模块系列基础视频】4.1.X-GUI图形界面库-画线画圆等函数简介
[液晶模块系列基础视频]4.1.X-GUI图形界面库-画线画圆等函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地 ...
- [转]SQLITE3 C语言接口 API 函数简介
SQLITE3 C语言接口 API 函数简介 说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新. /* 2012-05-25 */ int sq ...
随机推荐
- [Swift]LeetCode820. 单词的压缩编码 | Short Encoding of Words
Given a list of words, we may encode it by writing a reference string S and a list of indexes A. For ...
- 死磕 java集合之CopyOnWriteArrayList源码分析
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过 ...
- 【java设计模式】(3)---代理模式(案例解析)
设计模式之代理模式 一.概述 1.什么是代理模式? 解释第一遍:代理模式主要由三个元素共同构成: 1)一个接口,接口中的方法是要真正去实现的. 2)被代理类,实现上述接口,这是真正去执行接口中方法的类 ...
- 【Zara原创】SqlSugar4轻量级ORM框架的使用指南
前言:sqlSugar出生已经有3年之久了,从1.0到现在的4.x的版本,为了以后方便使用SqlSugar,所以特意花了2个小时来叙述它. 关于SqlSugar 性能:性能最好的ORM之一,具有超越D ...
- java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的
本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...
- 图像识别基本算法之SURF
图像识别.人脸识别可行的算法有很多.但是作为学习,如果能理清这个问题研究的历程及其主线,会对你深入理解当前研究最新的发展有很多帮助.本文是自己在学习过程中的笔记,大多内容来自于网络,出处请参考最后的引 ...
- 知其所以然~tcp和udp的区别
TCP UDP TCP与UDP基本区别 基于连接与无连接 TCP要求系统资源较多,UDP较少: UDP程序结构较简单 流模式(TCP)与数据报模式(UDP); TCP保证数据正确性,UDP可能丢包 T ...
- EF架构~Dapper.Contrib不能将Linq翻译好发到数据库,所以请不要用它
回到目录 对于Dapper是一个轻量级的数据访问框架,而需要使用者去自己做SQL,它,只是一个数据访问者! 对些,Dapper推出了Contrib扩展包,它可以友好的让开发人员使用linq,而不需要写 ...
- Kafka性能测试实例
1.概述 在分布式实时数据流场景下,随着数据量的增长,对Kafka集群的性能和稳定性的要求也很高.本篇博客将从生产者和消费者两方面来做性能测试,针对具体的业务和数据量,来调优Kafka集群. 2.内容 ...
- centos7安装xfce桌面
用了centos自带的gnome桌面 太重了 启动超慢 内存占用近2G 因此打算换一个轻量级的桌面xfce 先安装桌面协议yum groupinstall "X Window system& ...