用户自定义函数
在SQL Server中,用户不仅可以使用标准的内置函数,也可以使用自己定义的函数来实现一些特殊的功能。用户自定义函数可以在企业管理器中创建,也可以使用CREATE FUNCTION 语句创建。在创建时需要注意:函数名在数据库中必须唯一,其可以有参数,也可以没有参数,其参数只能是输入参数,最多可以有1024参数。
标量函数:返回单个数据值。
表值函数:返回值是一个记录集合--表。在此函数中,return语
句包含一条单独的select语句。
多语句表值函数:返回值是由选择的结果构成的记录集。
1、使用CREATE FUNCTION语句创建用户自定义函数
在查询分析器中,可以使用CREATE FUNCTION创建用户自定义函数,其语法格式如下:
CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS scalar_return_data_type
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END

function_name:指用户自定义函数的名称。其名称必须符合标识符的命名规则,并且对其所有者来说,该名称在数据库中必须唯一。
@parameter_name:用户自定义函数的参数,其可以是一个或多个。每个函数的参数仅用于该函数本身;相同的参数名称可以用在其它函数中。参数只能代替常量;而不能用于代替表名、列名或其它数据库对象的名称。函数执行时每个已声明参数的值必须由用户指定,除非该参数的默认值已经定义。如果函数的参数有默认值,在调用该函数时必须指定"default"关键字才能获得默认值。
scalar_parameter_data_type:参数的数据类型。
scalar_return_data_type:是用户定义函数的返回值。可以是 SQL Server 支持的任何标量数据类型(text、ntext、image 和 timestamp 除外)。
function_body:位于begin和end之间的一系列 Transact-SQL 语句,其只用于标量函数和多语句表值函数。
scalar_expression:用户自定义函数中返回值的表达式。

例:在STUDENT库中创建一个用户自定义函数XUEFEN,该函数通过输入成
绩来判断是否取得学分,当成绩大于等于50时,返回取得学分,否则,
返回未取得学分。其代码如下:
CREATE FUNCTION xuefen(@inputxf int) RETURNS nvarchar(10)
BEGIN
declare @retrunstr nvarchar(10)
If @inputxf >=50
set @retrunstr='取得学分'
else
set @retrunstr='未取得学分'
return @retrunstr
END
如果使用用户自定义函数,要在使用的时候指明函数的所有者和函数的名
称。在查询分析器中输入如下代码:
SELECT 学号,成绩,dbo.xuefen(成绩) AS 学分情况
FROM 课程注册
WHERE 课程号='0003'

2、使用企业管理器创建用户定义函数
在企业管理器中创建用户自定义函数的步骤为:
1)在企业管理器中,选择需要建立函数的数据库,从中选择用户定义函数图标。
2)选择用户定义函数图标后,击右健,从弹出的快捷菜单中选择“新建用户定义函数”命令,打开“用户定义函数属性”对话框,该属性窗口在“文本”框中列出了建立函数的框架,如图10.2所示。
3)在“文本”框中输入函数的所有者、函数名称、参数列表、返回类型和函数体等函数的各个组成部分。
4)单击“检查语法”按钮,检查输入的建立函数语句是否有语法错误。如果没有语法错误,单击“确定”按钮,将用户定义的函数保存到数据库中供用户以后使用。

例:在STUDENT库中创建一个用户自定义函数XUEFENJI,该函数通过输入成绩来计算学生的学分绩。其代码如下:
CREATE FUNCTION xuefenji(@inputzz int) RETURNS nvarchar(10)
BEGIN
declare @retrunstr nvarchar(10)
if @inputzz >=50 AND @inputzz <60
set @retrunstr='学分绩为0.8'
else if @inputzz >=60 AND @inputzz <70
set @retrunstr='学分绩为1.0'
else if @inputzz >=70 AND @inputzz <80
set @retrunstr='学分绩为1.2'
else if @inputzz >=80 AND @inputzz <=100
set @retrunstr='学分绩为1.5'
else
set @retrunstr='无学分绩'
return @retrunstr
END

用户自定义函数的分类-标量函数
例:
USE STUDENT
GO
SELECT 课程号,成绩,dbo.xuefenji(成绩) AS 学分绩
FROM 课程注册
WHERE 学号='010101001001'
GO
需要查看“010101001001”号学生的课程学分绩

用户自定义函数的分类-表值函数
表值函数遵循的原则:
1、RETURNS子句仅包含关键字table。不必定义返回变量的格式,因为它由RETURN 子句中的 SELECT 语句的结果集的格式设置。
2、function_body 不由BEGIN和END分隔。
3、RETURN子句在括号中包含单个SELECT语句。SELECT语句的结果集构成函数所返回的表。内嵌表值函数中使用的SELECT语句受到与视图中使用的SELECT语句相同的限制。

例:在STUDENT库中创建一个内嵌表值函数XUESHENG,该函数可以根据输入的系部代码返回该系学生的基本信息。其代码如下:
CREATE FUNCTION XUESHENG(@inputxbdm nvarchar(4)) RETURNS table
AS
RETURN
( SELECT 学号, 姓名, 入学时间 FROM 学生 WHERE 系部代码=@inputxbdm)
GO
建立好该内嵌表值函数后,就可以象使用表或视图一样来使用它:
SELECT * FROM DBO.XUESHENG('01')
GO

用户自定义函数的分类-多表值函数
例:在STUDENT库中创建一个多语句表值函数CHENGJI,该函数可以根据输入的课程名称返回选修该课程的学生姓名和成绩。其代码如下:
CREATE FUNCTION CHENGJI( @inputkc as char(20) )
RETURNS @chji TABLE
(
课程名 char(20),
姓名 char(8),
成绩 tinyint
)
AS
BEGIN
INSERT @chji
SELECT c.课程名,s.姓名 ,k.成绩
FROM 学生 as s INNER JOIN 课程注册 as k
ON s.学号 =k.学号 inner join 课程 as c
on c.课程号=k.课程号
WHERE c.课程名=@inputkc
RETURN
END
GO
在查询分析器中输入以下查询命令:
SELECT * FROM DBO.CHENGJIi('大学语文')

用户自定义函数的分类-多表值函数
总结:
多语句函数的主体中允许使用以下语句。
1、赋值语句。
2、控制流语句。
3、DECLARE 语句,该语句定义函数局部的数据变量和游标。
4、SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
5、游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以INTO子句向局部变量赋值的FETCH语句;不允许使用将数据返回到客户端的FETCH语句。
6、INSERT、UPDATE和DELETE语句,这些语句修改函数的局部table变量。
7、EXECUTE语句调用扩展存储过程。

SQL创建函数及应用的更多相关文章

  1. mysql 创建函数This function has none of DETERMINISTIC, NO SQL, or READS

    今天在mysql 5.6上创建函数的时候 发现报错: ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or R ...

  2. 第16课-数据库开发及ado.net-数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍

    第16课-数据库开发及ado.net 数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍 SQL语句入门(脚本.命令) SQL全名是结构化查询语言(Structur ...

  3. MySql创建函数与过程,触发器, shell脚本与sql的相互调用。

    一:函数 1:创建数据库和表deptartment, mysql> use DBSC; Database changed mysql), ), )); Query OK, rows affect ...

  4. mysql 创建函数ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_f

    mysql 创建函数的时候 报错 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL D ...

  5. MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators

    问题描述 通过Navicat客户端,创建MySQL函数(根据的当前节点查询其左右叶子节点)时报错,报错信息如下: This function has none of DETERMINISTIC, NO ...

  6. Mysql 创建函数出现This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA

    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary mys ...

  7. mysql 5.7 创建函数报错,This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creat

    今天用命令创建函数, 报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration ...

  8. Sql Server创建函数

    在使用数据库的过程中,往往我们需要对有的数据先进行计算,然后再查询出来,所以我们就需要创建函数来完成这项任务,在数据库的Programmability(如图1)下面的Function中创建函数(如图2 ...

  9. sql 判断 函数 存储过程是否存在的方法

    下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助.库是否存在if exists(select * from master..sys ...

随机推荐

  1. 一个简单的hibernate项目

    准备工作 工具准备 hibernate3.5.3 Eclipse Java EE IDE for Web Developers.Version: Helios MySQL5.5 环境配置搭建 安装并配 ...

  2. 推荐十款非常优秀的 HTML5 在线设计工具

    网络有很多优秀的设计和开发工具可能大家都不知道,因此这篇文章就向设计师推荐十款优秀 HTML5 在线工具,这些工具能够帮助设计师们设计出更有创意的作品.随着 HTML5 技术的不断成熟,网络上涌现出越 ...

  3. SSH登录失败:Host key verification failed

    转载自:https://help.aliyun.com/knowledge_detail/41471.html 注意:本文相关 Linux 配置及说明已在 CentOS 6.5 64 位操作系统中进行 ...

  4. DuiVision开发教程(17)-对话框

    DuiVision的对话框类是CDlgBase. 代码中假设须要创建一个对话框,一般建议使用DuiSystem类中封装的若干对话框相关的函数来操作,包括创建对话框.删除对话框.依据对话框名获取对话框指 ...

  5. Linux设备模型分析之kset(基于3.10.1内核)

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 内核版本:3.10.1   一.kset结构定义 kset结构体定义在include/linux/kobject.h ...

  6. MySQL Cluster2个数据节点压力测试--mysqlslap工具压400W写

    锅巴哥的个人建议:cluster叫电信运营商版本,所以基本上在很大的用户并发量的情况下才会用到,对连接数的线性增长要求高的场景,千兆就不用想了, 没万兆就不用玩了. 很不幸,我的就是千兆网络,我的数据 ...

  7. oc-01

    //#ifndef __OCDay01__aa__ //#define __OCDay01__aa__ //这2行是预编译指令,防止include的时候重复包含操作(a包含b,b又包含了a) #inc ...

  8. UWSGI安装与使用

    http://blog.csdn.net/chenggong2dm/article/details/43937433 http://blog.csdn.net/orangleliu/article/d ...

  9. C++中创建对象的时候加括号和不加括号的区别

    c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...

  10. 【ZZ】常用推荐算法

    http://liyonghui160com.iteye.com/blog/2082450 在推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程 ...