原文链接:https://blog.csdn.net/lanxingbudui/article/details/81736402

前言:
        在SQL server中不仅可以可以使用系统自带的函数(时间函数、聚合函数、字符串函数等等),还可以根据需要自定义函数。

一、定义:
用户自定义函数的类型:

1、标量值函数(返回一个标量值)

2、表格值函数(内联表格值函数、多语句表值函数,返回一个结果集即返回多个值)

二、三种自定函数的异同点
1、同点:

创建定义相同:

  1. CREATE FUNCTION F_NAME(传入的参数名称 传入参数的类型)
  2. RETURNS 返回值类型
  3. AS

2、异点:

a.标量值函数返回的是一个数据类型值,
                 内联表值函数返回的是一个table,而多语句表值函数返回的是一个table的变量(类似前面两个的结合);  
              b.语法的结构:标量值函数和多语句表值函数都是要有begin.........................end,内联表值函数就没有;      
              c.调用:标量函数要写成在dbo.function_name;

三、函数参数
参数可以是常量、表中的某个列、表达式或其他类型的值。在函数中有三种类型的参数。

1、输入:指必须输入一个值。

2、可选值:在执行该参数时,可以选择不输入参数。

3、默认值:函数中默认有值存在,调用时可以不指定该值。

四、举例说明:
1、标量值函数定义格式:

拿个具体的例子说事:

准备数据:之前有一篇博文写了新建表和插入数据的语句,可参考:

https://mp.csdn.net/postedit/81702708

想要输入时间得到名字的函数

  1. CREATE FUNCTION dbo.func_date_get_name(@date_into varchar(8))
  2. --CREATE FUNCTION 函数名称(@参数名 参数的数据类型)
  3. RETURNS varchar(20) --返回返回值的数据类型
  4. --[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密
  5. as
  6. BEGIN
  7. declare @result_name varchar(20)
  8. select @result_name = Value_name from test_ceshi where statdate = @date_into
  9. RETURN @result_name
  10. END
  11.  
  12. --select dbo.func_date_get_name('20180808') name;
  13. --select * from test_ceshi;

测试这个自定义函数:func_date_get_name ,即可得到name的结果为:Test1

以下是test_ceshi表的全量数据。

例子二:这个函数使用了if...else条件语句

--编写一个函数,该函数,可以通过输入借书时间来判断是否到期,当借阅时间大于30天,返回已经过期;否则返回还未到期。

  1. CREATE FUNCTION IsDateout(@BDate datetime)
  2. returns nvarchar(20)
  3. AS
  4. BEGIN
  5. DECLARE @myresult nvarchar(20)
  6. IF (datediff(day,@BDate,getdate())>30)
  7. BEGIN
  8. SET @myresult='已过期'
  9. end
  10. else
  11. begin
  12. set @myresult='未到期'
  13. end
  14. RETURN (@myresult)
  15. END
  16.  
  17. SELECT dbo.IsDateout(cast('2018-01-01' AS datetime))--结果已过期
  18. SELECT dbo.IsDateout(cast('2018-08-01' AS datetime))--结果未到期

2、内联表格值函数定义格式:

特点:内联表格值函数支持在WHERE子句中使用参数

  1. CREATE FUNCTION function_name(@parameter_name parameter_data_type)
  2. --CREATE FUNCTION 函数名称(@参数名 参数的数据类型)
  3. RETURNS table --返回一个表
  4. [WITH ENCRYPTION] --如果指定了 encryption 则函数被加密
  5. [AS]
  6. RETURN (一条SQL语句)

有了格式,写个实例:

  1. CREATE FUNCTION dbo.func_date_get_table(@date_into varchar(8))
  2.  
  3. RETURNS table
  4. --[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密
  5. as
  6. RETURN select statdate,Value_name from test_ceshi where statdate = @date_into
  7.  
  8. --select * from dbo.func_date_get_table('20180808') ;

得到如下的结果:

3、多语句表值函数定义格式:

多语句表值函数跟内联表值函数都是表值函数,它们返回的结果都是Table类型。多语句表值函数通过多条语句来创建Table类型的数据。这里不同于内联表值函数,内联表值函数的返回结果是由函数体内的SELECT语句来决定。而多语句表值函数,则是需要指定具体的Table类型的结构。也就是说返回的Table已经定义好要哪些字段返回。所以它能够支持多条语句的执行来创建Table数据。

  1. CREATE FUNCTION function_name(@parameter_name parameter_data_type)
  2. --CREATE FUNCTION 函数名称(@参数名 参数的数据类型)
  3. RETURNS @Table_Variable_Name table (Column_1 culumn_type,Column_2 culumn_type)
  4. --RETURNS @表变量 table 表的定义(即列的定义和约束)
  5. [WITH ENCRYPTION] --如果指定了 encryption 则函数被加密
  6. [AS]
  7. BEGIN
  8. 函数体(即 Transact-SQL 语句)
  9. RETURN
  10. END

因为此类型的自定义函数在实际工作中使用最多,我多举几个例子说明,有些是别人写的内容:

例子1:

  1. CREATE FUNCTION dbo.func_date_get_table_test(@date_into varchar(8))
  2. RETURNS @table_test table(date varchar(8),ID varchar(20),name varchar(20))
  3. --[WITH ENCRYPTION] --如果指定了 encryption 则函数被加密
  4. as
  5. begin
  6. insert @table_test select statdate,value_id,Value_name from test_ceshi where statdate = @date_into
  7. RETURN
  8. end
  9.  
  10. --select * from dbo.func_date_get_table_test(20180808);

测试函数dbo.func_date_get_table_test(),结果如下图:

例子2:出处--海盗船长  https://www.cnblogs.com/baidawei/p/4732969.html

  1. create function dbo.Test()
  2. returns @temp table (
  3. name varchar(20),
  4. sex char(2),
  5. age int
  6. )
  7. as
  8. begin
  9. insert into @temp (name,sex,age) values ('多语句','嘛',18)
  10. insert into @temp (name,sex,age) select name,sex,age from student where age > 18
  11. return
  12. end

五、修改和删除自定义函数

1、使用alter语句修改自定义函数:

--格式:

  1. alter function 函数名(参数)
  2. returns table
    as
    return(一条SQL语句)

2、使用drop语句删除:

  1. drop function func_date_get_name

六、注意事项:
在编写自定义函数时需要注意的:

标量函数:

1.      所有的入参前都必须加@

2.      create后的返回,单词是returns,而不是return

3.      returns后面的跟的不是变量,而是返回值的类型,如:int,char等。

4.      在begin/end语句块中,是return。

内联表格值函数:

1.      只能返回table,所以returns后面一定是TABLE

2.      AS后没有begin/end,只有一个return语句来返回特定的记录。

多语句表值函数:

1.      returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字TABLE,最后是表的结构。

2.      在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回。

3.      最后只需要return,return后面不跟任何变量。

SQL server 自定义函数FUNCTION的使用的更多相关文章

  1. SQL Server 自定义函数(Function)——参数默认值

    sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Functio ...

  2. sql server 自定义函数的使用

    sql server 自定义函数的使用 自定义函数 用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回 用户自定义函数的类型: 标量函数:返回一个标量值 表格值函数{内联表格值函 ...

  3. 13、SQL Server 自定义函数

    SQL Server 自定义函数 在SQL Server中不仅可以使用系统函数(如:聚合函数,字符串函数,时间日期函数等)还可以根据需要自定义函数. 自定义函数分为标量值函数和表值函数. 其中,标量值 ...

  4. 也来谈谈SQL SERVER 自定义函数~

    在使用SQL SERVER 数据库的时候,函数大家都应该用过,简单的比如 系统聚合函数 Sum(),Max() 等等.但是一些初学者编写自定义函数的时候,经常问起什么是表值函数,什么是标量值函数. 表 ...

  5. sql server自定义函数学习笔记

    sql server中函数分别有:表值函数.标量函数.聚合函数.系统函数.这些函数中除系统函数外其他函数都需要用户进行自定义. 一.表值函数 简单表值函数 创建 create function fu_ ...

  6. SQL Server自定义函数( 转载于51CTO )

    用户自定义函数自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数在查询或存储过程等的程序中使用,也可以像相信过程一样能过 execute 命令来执行.自定义函数中存储了一个 Transact ...

  7. sql server 自定义函数

    create function 函数名 (@pno int) returns int as begin declare @a int if not exists(select * from perso ...

  8. SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0

    最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面 ...

  9. SQL SERVER 自定义函数 split

    Create function [dbo].[split] ( ), ) ) )) as begin declare @i int set @SourceSql=rtrim(ltrim(@Source ...

随机推荐

  1. 小菜鸟之liunx

    目录 第一章:Linux简介 1 Linux特点 1 CentOS 1 第二章:Linux安装 2 Linux目录结构 2 第三章:Linux常用命令 2 Linux命令的分类 3 操作文件或目录常用 ...

  2. 【AtCoder】AGC001

    AGC001 A - BBQ Easy 从第\(2n - 1\)个隔一个加一下加到1即可 #include <bits/stdc++.h> #define fi first #define ...

  3. 二叉查找树 & B(B-)树 & B+树 & B*树

    一 二叉查找树 1 特点 (1)所有非叶子结点至多拥有两个子节点, left和right (2)一个结点存储一个关键字 (3)非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树 2 ...

  4. 微信小程序 基本介绍及组件

    创建项目 微信开发工具深入介绍 https://developers.weixin.qq.com/miniprogram/dev/devtools/devtools.html 基本项目目录 1. 配置 ...

  5. 【Trie】Secret Message 秘密信息

    [题目链接]: https://loj.ac/problem/10054 [题意] 我认为这个题目最难的是题意: 其实分了两种情况: 1.如果当前文本串匹配不完,那么答案的是:匹配过程中遇到的模式串结 ...

  6. Java 抽象类详解

    在<Java中的抽象方法和接口>中,介绍了抽象方法与接口,以及做了简单的比较. 这里我想详细探讨下抽象类. 一.抽象类的定义 被关键字“abstract”修饰的类,为抽象类.(而且,abx ...

  7. MyBatis Java不同方式加载文件时的路径格式问题、Mybatis中加载.properties文件

    public class LoadPropTest { public static void main(String[] args) throws IOException { //一.Properti ...

  8. 浅谈后缀数组SA

    这篇博客不打算讲多么详细,网上关于后缀数组的blog比我讲的好多了,这一篇博客我是为自己加深印象写的. 给你们分享了那么多,容我自私一回吧~ 参考资料:这位dalao的blog 一.关于求Suffix ...

  9. mybatis的BLOB存储与读取

    http://blog.csdn.net/luyinchangdejiqing/article/details/45096689 简单介绍一下背景环境,web开发避免不了照片附件之类的东东,原先是存到 ...

  10. JS 验证字符串是否能转为json格式

    var isJSON=function (str) { if (typeof str == 'string') { try { var obj = JSON.parse(str); if (typeo ...