SQL Server--用户自定义函数

除了使用系统提供的函数外,用户还可以根据需要自定义函数。用户自定义函数是 SQL Server 2000 新增的数据库对象,是 SQL Server 的一大改进。与编程语言中的函数类似,Microsoft SQL Server 用户定义函数是接受参数、执行操作(例如复杂计算)并将操作结果以值的形式返回的例程。返回值可以是单个标量值或表变量结果集。

  用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过 EXECUTE 命令来执行。

   在 SQL Server 中根据函数返回值形式的不同将用户自定义函数分为三种类型

    (1)标量函数

   (2)内联表值函数

   (3)多语句表值函数

   注意:与编程语言中的函数不同的是,SQL Server 自定义函数必须具有返回值。

 

标量函数

   标量函数返回一个确定类型的标量值,其返回值类型为除TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP和TABLE类型外的其它数据类型。函数体语句定义在BEGIN-END语句内。在 RETURNS 子句中定义返回值的数据类型,并且函数的最后一条语句必须为Return语句。创建标量函数的格式:

Create Function 函数名(参数)

Returns 返回值数据类型

[With {Encryption|Schemabinding}]

[AS]

BEGIN

    SQL语句(必须有Return子句)
END

举例:

CREATE FUNCTION dbo.Max
(
    @a int,
    @b int
)
RETURNS int AS 
BEGIN
    DECLARE @max int
    IF @a>@b  SET  @max=@a
    ELSE   SET  @max=@b
    Return @max
END

   调用标量函数

   可以在 T-SQL 语句中允许使用标量表达式的任何位置调用返回标量值(与标量表达式的数据类型相同)的任何函数。必须使用至少由两部分组成名称的函数来调用标量值函数,即架构名.对象名,如dbo.Max(12,34)。

 

内联表值函数

   内联表值型函数以表的形式返回一个返回值,即它返回的是一个表。内联表值型函数没有由BEGIN-END 语句括起来的函数体。其返回的表是由一个位于 RETURN 子句中的 SELECT 命令从数据库中筛选出来。内联表值型函数功能相当于一个参数化的视图

Create Function 函数名(参数)

RETURNS table

[with {Encryption|Schemabinding}]

AS

Return(一条SQL语句)

举例:

CREATE FUNCTION func (@id char(8))
RETURNS TABLE
AS
RETURN
(
    SELECT * FROM student WHERE SID = @id

)

   调用内联表值函数:调用时不需指定架构名,如select * from func('51300521')

 

多语句表值函数

   多语句表值函数可以看作标量函数和内联表值函数的结合体。它的返回值是一个表,但它和标量型函数一样有一个用 BEGIN-END 语句括起来的函数体,返回值的表中的数据是由函数体中的语句插入的。由此可见,它可以进行多次查询,对数据进行多次筛选与合并,弥补了内联表值函数的不足。

Create Function 函数名(参数)

RETURNS 表变量名 (表变量字段定义)

[with {Encryption|Schemabinding}]

AS

BEGIN

    SQL语句

    Return

END

举例:
CREATE FUNCTION func(@selection int)
RETURNS @table TABLE
(
    SID char(4) primary key not null,
    SName nvarchar(4) null
)
AS
BEGIN
    IF @selection = 0
        INSERT INTO @table (SELECT SID,SName FROM student0)
    ELSE 
        INSERT INTO @table (SELECT SID,SName FROM student1)
    Return
END

   调用多语句表值函数:和调用内联表值函数一样,调用时不需制定架构名。

 

注意:Schemabinding用于将函数绑定到它引用的对象上。函数一旦绑定,则不能删除、修改,除非删除绑定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言exit和return区别,在fork和vfork中使用

From: http://www.cnblogs.com/laojie4321/archive/2012/03/31/2426910.html exit函数在头文件stdlib.h中。 exit(0):正常运行程序并退出程序; exit(1):非正常运行导致退出程序;…

[react] 说说你对“在react中,一切都是组件”的理解

[react] 说说你对“在react中,一切都是组件”的理解 React采用组件化的思想,最小的组件单位就是原生HTML元素,采用JSX的语法声明组件的调用React的虚拟DOM,就是一个大的组件树,从父组件层到子组件,在rende…

DWT算法

C写的DWT算法转载于:https://blog.51cto.com/yerik/764890

gcc 编译选项

From: http://blog.csdn.net/guogeer/article/details/7407508 [html] view plaincopy下列选项控制编译器警告信息: --all-warnings 此开关缺少可用文档 --extra-warnings 此开关缺少可用文档 -W 不建议使用此开关…

[react] react中的key有什么作用?

[react] react中的key有什么作用? react利用key来识别组件,它是一种身份标识标识,就像我们的身份证用来辨识一个人一样。每个key对应一个组件,相同的key react认为是同一个组件,这样后续相同的key对应组件都不会被创建…

【转】ps命令详解

原文地址:http://apps.hi.baidu.com/share/detail/32573968 有 时候系统管理员可能只关心现在系统中运行着哪些程序,而不想知道有哪些进程在运行。由于一个应用程序可能需要启动多个进程。所以在同等情况下,进程的数 量要比程序多的多。为此从…

Amazon S3 设置对象的生命周期Lifecycle

2019独角兽企业重金招聘Python工程师标准>>> 保存在S3上面的文件,有些是长期保存的,而有一些我们却不希望保存太久,过一段时间后就可以删除了。例如备份文件,太旧的就要删除;又或如日志文件,只保…

[react] react非父子组件如何通信?

[react] react非父子组件如何通信? redux context 个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

fatal error C1083: 无法打开包括文件:dxtrans.h: No such file or directory

From: http://blog.csdn.net/pkueecser/article/details/7287938 fatal error C1083: 无法打开包括文件:"dxtrans.h": No such file or directory http://blog.waterlin.org/articles/qedit-problem-in-windows-directshow.html 在使用有关 DirectShow 东西的时…

开灯问题---------简单模拟

有n盏灯,编号为1~n,第一个人把所有灯都打开,第2个人按下所有编号为2的倍数的开关(这些灯将会被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭)…

[react] react中遍历时为什么不用索引作为唯一的key值?

[react] react中遍历时为什么不用索引作为唯一的key值? key值的目的在Diff DOM的时候根据render前后的唯一key值快速的对树进行比较,保证key值得唯一性,如在进行中间插入或者最顶上插入时,算法会很明显得知道这是一个插入动作&am…

TortoiseGit + GitHub 快速上手指南

TortoiseGit GitHub 快速上手指南 名词解释: 1. TortoiseGit 是 TortoiseSVN的Git版,它很好的实现了与windows资源管理器的融合,使用界面与TortoiseSVN非常类似。 2. TortoiseGit运行在msysgit(git的windows开源版本)之上,因此,在…

无法访问windows安装服务的解决

From: http://www.cnblogs.com/huangweilin/archive/2012/12/20/2826032.html 一、问题的提出 一部计算机,要安装类似ofiice的软件,提示无法访问windows安装服务的解决,要卸载类似office的软件,也提示无法访问windows安装服务的…

VMware Fusion8下CentOS7.1 安装vmtools报错kernel header path

VMware Fusion8CentOS7.1安装vmtools ---找不到gcc和kernel header path的解决办法 环境: OSX 10.11.2 VMware Fusion 8.0.2 CentOS 7.1 错误: 1.gcc错误 Searching for GCC...The path "" is not valid path to the gcc binary. 2.内核头文件问题 Searching for a v…

[react] 说说你对reader的context的理解

[react] 说说你对reader的context的理解 这个题想问的应该是render函数的上下文,而非React.createContext的那个Context。 不管是class组件还是函数式组件,React的组件本质上都是函数,从根组件到下面大大小小的子组件,React组件树…

Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果 - 伪 HDR/Blow

所谓HDR就是高动态范围的意思。在普通的显示器和位图里,每通道都是8-bit,也就是说RGB分量的范围都是0-255,这用来表示现实中的颜色显然是远远不够的。现实中的图像的动态范围远远大的多,那么如何在现有的显示设备里尽可能的保持更…

[react] react中什么是非控组件?

[react] react中什么是非控组件? 表单元素的value/checked值、onChange事件没有和组件的state存在绑定关联关系,如果需要获取表单元素的值,需要使用ref获取DOM,然后得到元素的值.demo如下: import React from react;…

[spring-framework]Spring定时器的配置和使用

开发中我们常常会做一些定时任务&#xff0c;这些任务有开始时间&#xff0c;并会按一定的周期或规则执行。如此我们在Java程序开发中使用定时器来处理定时任务。 <!-- MessageRequestTask类中包含了msgRequest方法&#xff0c;用于执行定时任务 --> <bean id"ms…

安装Microsoft Windows SDK 7.1时出现的错误(附解决办法)

From: http://blog.sina.com.cn/s/blog_617c05b001015baw.html 错误回放一: A problem occurred while installing selected Windows SDKcomponents. Installation of the "Microsoft Windows SDK for Windows 7Compilers for x86" product has reported the follow…

上载数据

*&---------------------------------------------------------------------**& 包括 ZHENGZJ_TEST001_FORM*&---------------------------------------------------------------------**&--------------------------------------------------…