SQL创建函数及应用
用户自定义函数
在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创建函数及应用的更多相关文章
- 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 ...
- 第16课-数据库开发及ado.net-数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍
第16课-数据库开发及ado.net 数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍 SQL语句入门(脚本.命令) SQL全名是结构化查询语言(Structur ...
- MySql创建函数与过程,触发器, shell脚本与sql的相互调用。
一:函数 1:创建数据库和表deptartment, mysql> use DBSC; Database changed mysql), ), )); Query OK, rows affect ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- Sql Server创建函数
在使用数据库的过程中,往往我们需要对有的数据先进行计算,然后再查询出来,所以我们就需要创建函数来完成这项任务,在数据库的Programmability(如图1)下面的Function中创建函数(如图2 ...
- sql 判断 函数 存储过程是否存在的方法
下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助.库是否存在if exists(select * from master..sys ...
随机推荐
- WordPress主题制作教程[壹] - 了解WP&结构&索引
最近开始筹备WordPress主题开发了.首先我们在此章节中进行了解什么是WP,以及WP的结构.通过这个文章索引到以后所写的WP系列教程. (抱歉,大家不要急,持续更新中....) 1.首先,我们来认 ...
- vsftpd 权限设置
vsftpd 虚拟用户 多用户不同权限 2010-06-27 00:54:20| 分类: linux大杂绘|举报|字号 订阅 1.需要建立一个用户,这个用户是linux系统的本地用户,各ft ...
- Realsense 提取彩色和深度视频流
一.简要介绍 关于realsense的介绍,网上很多,这里不再赘述,sdk及相关文档可参考realsense SDK,也可参考开发人员专区. 运行代码之前,要确保你已经安装好了realsense的DC ...
- ADO.NET 快速入门(一):ADO.NET 概述
ADO.NET 概述 ADO.NET是改进的ADO数据访问模型用于开发可扩展应用程序.他是专门为可伸缩性.无状态和XML核心的web而设计的. ADO.NET使用一些ADO对象,如Connecti ...
- HDU 5515 Game of Flying Circus 二分
Game of Flying Circus Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...
- BZOJ 3505: [Cqoi2014]数三角形 数学
3505: [Cqoi2014]数三角形 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- 判断文件是否为UTF8编码
utf8的规则比较简单: 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符; 如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个 ...
- pt-online-schema-change原理解析 博客相关需要阅读
xiaoboluo768 http://www.lai18.com/user/481193.html 都说pt-toolkit工具集中的pt-online-schema-change可以在线不锁 ...
- LINUX C++ 技术博客
http://blog.csdn.net/pcliuguangtao/article/category/676422
- Panopticon跨平台的逆向工程反汇编工具
http://www.freebuf.com/sectool/104045.html Panopticon 使用GPLv3授权许可,其免费. 项目文档:https://panopticon.re. 问 ...