16--用户自定义函数

上传人:油条 文档编号:31361561 上传时间:2018-02-07 格式:PPT 页数:42 大小:222.50KB
返回 下载 相关 举报
16--用户自定义函数_第1页
第1页 / 共42页
16--用户自定义函数_第2页
第2页 / 共42页
16--用户自定义函数_第3页
第3页 / 共42页
16--用户自定义函数_第4页
第4页 / 共42页
16--用户自定义函数_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《16--用户自定义函数》由会员分享,可在线阅读,更多相关《16--用户自定义函数(42页珍藏版)》请在金锄头文库上搜索。

1、1/42,第16章用户自定义函数,2/42,16.1 用户自定义函数的基本概念,SQL Server允许创建用户定义函数用户定义函数是可返回值的例程,3/42,用户定义函数种类,返回可更新数据表的函数,返回不可更新数据表的函数,返回标量值的函数,若函数含单个SELECT语句且可更新,则返回的数据表可更新,若函数含多个SELECT语句或一个不可更新的SELECT语句,则返回的数据表不可更新,4/42,16.2 创建用户自定义函数,16.2.1创建用户自定义函数,CREATE FUNCTION owner-name, function-name(parameter-name scalar_para

2、meter_datetype =default,n),参数名,局部变量,参数数据类型,5/42,RETURNS scalar_return_datatypeWITH ,n ASBEGINsql-statementRETURN scalar-expressionEND,用户自定义函数的返回值,函数中返回值的表达式,6/42,SCHEMABINING选项可将函数绑定到它所引用的数据库对象,function-option,ENCRYPTION选项可以实现 SQL Server加密包含CREATE FUNCTION语句文本的系统表列,7/42,例:在Northwind库上创建自定义函数my_funct

3、ion1,通过向该函数输入代表商品年销售额的money类型参数的大小返回字符串,若年销售额大于10000,返回“热销商品”,否则返回“非热销商品”,8/42,USE NorthwindgoCREATE FUNCTION my_function1 (moneyinput money)RETURNS nvarchar(5),9/42,BEGINDECLARE returnstring nvarchar(5)IF moneyinput10000SET returnstring=非热销商品ELSESET returnstring=热销商品RETURN returnstringEND,10/42,在No

4、rthwind库上有一个记录各种产品在1997年销售额的视图,通过它来引用新建的my_function1,查看哪些商品属于热销商品USE NorthwindgoSELECT ProductName, ProductSales,dbo.my_function1(ProductSales) AS DiscriptionFROM Product sales for 1997WHERE CategoryName=Dairy Products,11/42,12/42,16.2.2查看用户自定义函数,自定义函数的名称保存在sysobjects系统表中,创建自定义函数的源代码保存在syscomments系统

5、表中,13/42,1. 使用系统存储过程查看,EXEC sp_help(sp_helptext) ,例:用系统存储过程sp_helptext 查看用户自定义函数my_funciton1的定义文本信息USE NorthwindgoEXEC sp_helptext my_function1go,14/42,15/42,2. 使用系统表或系统信息架构视图,在SQL Server中存在三个信息架构视图报告有关用户自定义函数的信息,ROUTINESPARAMETERSROUTINE_COLUMNS,这些信息架构视图也是基于系统表sysobjects和syscomments实现的,16/42,例:使用系统

6、表sysobjects查看数据库Northwind上存在的所有用户自定义函数的相关信息。USE NorthwindSELECT * from sysobjectsWHERE type=FNgo,17/42,16.3 用户自定义函数类型,自定义函数有三种类型,标量函数,内嵌表值函数,多语句表值函数,18/42,16.3.1 标量函数,标量函数返回在 RETURNS子句中定义的数据类型的单个数据值,标量函数可重复调用,19/42,例:创建标量函数,要求将当前系统日期转化为年月日格式的字符串并返回,且默认的分隔符为 : ,并允许用户自行定义分隔符,20/42,CREATE FUNCTION my_f

7、unction2(DATE datetime, separator nvarchar(2)=:)RETURNS nvarchar(20)BEGINDECLARE returnstring nvarchar(20),21/42,SET returnstring=今天是+CONVERT(nvarchar(5), datepart(year,date)+年 +separator+CONVERT(nvarchar(5), datepart(month,date)+月 +separator+CONVERT(nvarchar(5), datepart(day,date)+日RETURN returnstr

8、ingEND,22/42,如何调用新建立的标量函数呢?可以运行如下命令:SELECT dbo.my_function2(GETDATE(),-),返回当天的年、月和日,23/42,16.3.2 内嵌表值函数,在内嵌表值函数中,RETURN子句中包含有一条单独的SELECT语句,该语句的结果构成了内嵌表值函数所返回的表,可替代视图,可用在T-SQL查询中允许表或视图表达式的地方,24/42,视图:受限于单个 SELECT 语句,不允许包含用户自己提供的参数,内嵌表值函数:可包含附加的语句,使函数所包含的逻辑比视图的逻辑更强,返回表的内嵌表值函数还可替换返回单个结果集的存储过程,25/42,例:

9、在Northwind数据库上建立一个可以根据输入的城市名返回所有该城市的客户和供应商的信息的内嵌表值函数my_function3,26/42,USE NorthwindGoCREATE FUNCTION my_function3(RegionParameter nvarchar(25)RETURNS tableAS,27/42,RETURN(SELECT City, CompanyName, ContactName, Customers AS Relationship FROM CustomersWHERE City=RegionParameterUNION SELECT City, Comp

10、anyName, ContactName, SuppliersFROM SuppliersWHERE City=RegionParameter),28/42,下面示例使用新建立的内嵌表值函数my_function3来获取“巴黎”市的所有客户和供应商的信息 SELECT * FROMdbo.my_function3(Paris)go,29/42,如果用户想通过视图“Customerand Suppliers by City”来实现同样的目的,则使用如下查询命令:SELECT * FROM Customer and Suppliers by CityWHERE City=Parisgo,30/42

11、,16.3.3 多语句表值函数,多语句表值函数的主体中允许使用的语句,赋值控制流DECLARESELECT游标操作INSERTUPDATEDELETEEXECUTE,31/42,例: 在Northwind库上利用视图Customer and Suppliers by City,建立一个可以根据输入的城市名和用户要求返回所有该城市的客户或供应商的信息的多语句表值函数my_function4,并将其与上例建立的内嵌表值函数my_function3对比,32/42,USE NorthwindGOCREATE FUNCTION my_function4(RegionParameter nvarchar

12、(25), SelectParameter char(9)RETURNS my_table TABLE(City nvarchar(15) NULL, CompanyName nvarchar(40) NOT NULL, ContactName nvarchar(30) NULL),33/42,ASBEGININSERT my_table SELECT City, CompanyName, ContactName FROM Customer and Suppliers by CityWHERE City=RegionParameter AND Relationship=SelectParame

13、terRETURNEND,34/42,下面举例说明使用多语句表值函数my_function4分别获取来自Paris的所有客户和供应商的信息。命令如下:SELECT * FROMdbo.my_function4(Paris,Customers)goSELECT * FROMdbo.my_function4(Paris,Suppliers)go,35/42,16.4 修改和删除用户自定义函数,16.4.1 修改用户自定义函数,CREATE FUNCTION ower-name, function-name( parameter-name scalar-parameter-datetype =def

14、ault,n)RETURNS scalar-return-datatypeWITH ,n ASBEGINsql-statementRETURN scalar-expressionEND,36/42,例:修改在Northwind库上创建的自定义函数my_function1,将区分商品是否热销的年销售额由当初的10000提高到20000ALTER FUNCTION my_function1 (moneyinput money)RETURNS nvarchar(5),37/42,BEGINDECLARE returnstring nvarchar(5)IF moneyinput20000SET re

15、turnstring=非热销商品ELSESET returnstring=热销商品RETURN returnstringEND,38/42,16.4.2 删除用户自定义函数,DROP FUNCTION ower-name, function-name,例:删除在Northwind库上创建的自定义函数my_function1DROP FUNCTION my_function1,39/42,16.4.3 设置用户自定义函数的权限,设置自定义函数的权限类似于设置表或其他数据库对象的权限,要为用户授予 CREATE FUNCTION 权限,才能进行创建、修改或删除自定义函数的操作,40/42,对于标量值函数,一般用户在使用此函数前,必须先被授予此函数上的 EXECUTE 权限,41/42,如果函数是表值函数,则用户在引用函数前必须对函数具有 SELECT权限,42/42,若CREATE TABLE或ALTER TABLE语句在CHECK约束、DEFAULT约束、计算列中引用了自定义函数,那么该表的所有者也要拥有该函数,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号