触发器、存储过程和函数三者有何区别 四
- 格式:docx
- 大小:18.10 KB
- 文档页数:4
存储过程和函数的区别 存储过程和函数的区别你想知道吗?下⾯是店铺给⼤家整理的存储过程和函数的区别,供⼤家参阅! 存储过程和函数的区别 存储过程和函数的不同之处在于: 函数必须有⼀个且必须只有⼀个返回值,并且还要制定返回值的数值类型。
存储过程可以有返回值,也可以没有返回值,甚⾄可以有多个返回值,所有的返回值必须由输⼊IN或者是输出OUT参数进⾏指定。
两者赋值的⽅式不同: 函数可以采⽤select ...into ...⽅式和set值得⽅式进⾏赋值,只能⽤return返回结果集。
过程可以使⽤select的⽅式进⾏返回结果集。
使⽤⽅法不同: 函数可以直接⽤在sql语句当中,可以⽤来拓展标准的sql语句。
存储过程,需要使⽤call进⾏单独调⽤,不可以嵌⼊sql语句当中。
函数中函数体的限制较多,不能使⽤显式或隐式⽅式打开transaction、commit、rollback、set autocommit=0等。
但是存储过程可以使⽤⼏乎所有的失sql语句。
存储过程种类 1系统存储过程 以sp_开头,⽤来进⾏系统的各项设定.取得信息.相关管理⼯作。
2本地存储过程 ⽤户创建的存储过程是由⽤户创建并完成某⼀特定功能的存储过程,事实上⼀般所说的存储过程就是指本地存储过程。
3临时存储过程 分为两种存储过程: ⼀是本地临时存储过程,以井字号(#)作为其名称的第⼀个字符,则该存储过程将成为⼀个存放在tempdb数据库中的本地临时存储过程,且只有创建它的⽤户才能执⾏它; ⼆是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为⼀个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程⼀旦创建,以后连接到服务器的任意⽤户都可以执⾏它,⽽且不需要特定的权限。
4远程存储过程 在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使⽤分布式查询和EXECUTE命令执⾏⼀个远程存储过程。
MySQL中的触发器和存储过程的区别与用途MySQL是一种常用的关系型数据库管理系统,广泛应用于各种互联网应用中。
在MySQL中,触发器(Trigger)和存储过程(Stored Procedure)是两种常见的编程方式,用于实现数据库操作的自动化和业务逻辑的封装。
本文将探讨MySQL中的触发器和存储过程的区别和用途。
一、触发器触发器是MySQL中一种特殊的数据库对象,它和数据库表关联,并在表中的指定事件发生时自动执行特定的操作。
触发器是基于事件驱动的,它可以在数据插入、更新或删除时触发执行相应的操作。
1. 触发器的创建在MySQL中,创建触发器需要使用CREATE TRIGGER语句,并指定触发时机、触发事件、触发操作和触发操作所执行的SQL语句。
例如,我们可以创建一个在数据插入前触发的触发器如下所示:```CREATE TRIGGER before_insert_triggerBEFORE INSERT ON table_nameFOR EACH ROWBEGIN-- 触发操作所执行的SQL语句...END;```2. 触发器的用途触发器可以用于各种场景,例如数据自动更新、数据约束、数据一致性等。
下面以一个实例来说明触发器的用途。
假设我们有一个订单表和一个库存表,每当有订单数据插入时,我们希望自动更新库存表中对应商品的库存数量。
这时,就可以使用触发器实现该功能。
```CREATE TRIGGER update_inventoryAFTER INSERT ON ordersFOR EACH ROWBEGINUPDATE inventorySET quantity = quantity - NEW.amountWHERE product_id = NEW.product_id;END;```在上述示例中,我们创建了一个名为update_inventory的触发器,它在订单表插入数据后触发,然后执行更新库存表的操作。
本章内容:·了解存储过程的优点·学会如何创建存储过程·学会如何调用存储过程·学会如何创建函数·学会如何调用函数·学会如何创建和使用触发器·存储过程:在Oracle中,可以在数据库中定义一个PLSQL的子程序,这种程序被保存在数据库中,存储在数据字典中,也可以进行不同用户之间的共享。
·存储过程的优点:·存储过程执行在数据库服务器中,执行速度非常快·执行一次之后,代码会保留在高速缓存区,以后执行只要调用高速缓存区的编译好的代码,系统的性能可以得到很大的提高。
·安全性很高·可以自动的完成预先设置的任务。
参数的命名必须符合规范,在一个存储过程中,可以不传递参数,也可以传递一个或多个参数,和函数一样,参数的类型有三种,in 、out、in outin:表示传入参数out:表示返回的参数in out:表示即使传入的参数,也是返回的参数(一般情况下,这种一般不会使用)存储过程结束时要跟上存储过程的名称。
如何去调用存储过程的问题:删除存储过程:drop procedure 存储过程名称·函数:·具有返回值的子程序·里面存在return语句·存储在数据库中,可以由任意的PLSQL程序区调用函数函数的两个组成部分:·说明以function开始,以return结束·主体以is 开始,以end 或者end 函数名结束以上的程序可能有问题,如果存在并发操作的时候,可能会取得相同的值。
一般情况下,去取得主键值的方法应该要新建一个表格,用于存储下一主键值。
在一个系统中,所有表格都使用JDBC去调用此函数。
在函数的定义过程中,参数应该尽量避免使用in 、out、in out触发器:触发器其实就是一些过程,只是用于表数据的保护,当进行一些增删改的时候,触发器会自动的执行,实现数据的完整性,触发器和应用程序无关。
MySQL中的触发器与存储过程的对比与选择MySQL是一款十分流行的关系型数据库管理系统,它提供了丰富的功能和灵活的开发方式。
在MySQL中,触发器和存储过程是两种常用的数据库对象,它们可以在特定事件发生时自动执行一系列操作。
本文将对MySQL中的触发器和存储过程进行对比与选择。
一、概述触发器和存储过程都是MySQL中的数据库对象,它们可以在特定的数据库事件发生时自动触发执行一系列操作。
触发器通常与特定表相关联,当表中的数据发生变化时触发执行,而存储过程是一段预定义的可重复使用的代码块,可以在任意时候被调用执行。
二、触发器触发器是在特定表上定义的一种数据库事件响应机制,当表中的数据发生增删改等操作时,触发器会自动执行一系列动作。
触发器可以在数据发生改变之前或之后执行,可以对数据进行修改、删除、插入等操作。
触发器的优点是可以对数据库操作进行自动化的监控和处理,能够确保数据的完整性和一致性。
触发器的缺点是在操作过程中可能会引发复杂的逻辑,导致性能下降和维护困难,因此需要谨慎使用。
三、存储过程存储过程是一段预先编译的可重复使用的代码块,可以在任意时候被调用执行。
存储过程可以接受参数,并且可以返回结果。
存储过程可以通过显式的调用执行,并且可以在过程内部进行逻辑控制和事务管理。
存储过程的优点是可以将一系列操作封装在一起,方便调用和管理。
存储过程可以减少网络传输的开销,提高系统的性能。
存储过程的缺点是编写和调试相对复杂,需要保证其逻辑的正确性和安全性。
四、触发器与存储过程的对比触发器和存储过程都是MySQL中的常用数据库对象,它们在某些方面有相似之处,但也存在一些不同之处。
1. 数据库事件:触发器是与表相关联的,它们在表中的数据发生增删改等操作时被触发执行;而存储过程可以在任意时候被调用执行。
2. 执行时机:触发器可以在数据发生变化之前或之后执行,可以对数据进行修改、删除、插入等操作;而存储过程是在显式调用时执行,可以进行逻辑控制和事务管理。
数据库触发器与存储过程数据库触发器和存储过程是数据库系统中常用的两种方法,用于在特定的数据库操作发生时执行特定的操作。
虽然它们有一些相似之处,但在功能和用法上存在一些区别。
本文将对数据库触发器和存储过程进行详细介绍,以及它们的应用场景和优缺点。
一、数据库触发器数据库触发器是一种特殊的存储过程,它会在数据库中特定的操作发生时自动触发执行。
触发器可以在数据的插入(INSERT)、更新(UPDATE)和删除(DELETE)操作之前或之后执行。
触发器通常用于实现数据的一致性约束和业务逻辑。
比如,当某个表中的数据被更新时,触发器可以用来确保相关的数据也被更新或者进行其他的计算和操作。
触发器可以在数据库中定义,并与特定的表相关联。
数据库触发器的优点是能够实现数据的自动化管理和保护,避免数据的不一致和错误。
同时,触发器也可以减少对应用程序的依赖,提高数据库的性能。
然而,触发器的缺点是可能会增加系统的复杂性,对于大型数据库来说,触发器的执行也可能会影响到数据库的效率。
二、存储过程存储过程是一种在数据库中预先定义的一组SQL语句的集合,类似于子程序或函数。
存储过程可以接收参数,并返回结果集,通过调用存储过程可以实现复杂的业务逻辑和数据处理。
存储过程通常用于提高数据库的性能和安全性。
通过将一些常用的SQL操作封装成存储过程,可以减少应用程序和数据库之间的通信开销,提高数据的处理速度。
此外,存储过程还可以进行权限控制,只允许特定的用户或角色执行存储过程,保证数据的安全性。
存储过程的优点是能够提高数据库的性能和安全性,使得应用程序更加简洁高效。
同时,存储过程还可以避免SQL注入等安全隐患。
然而,存储过程的编写和管理可能较为繁琐,需要熟悉数据库的语法和特性。
三、数据库触发器和存储过程的应用场景1. 数据库触发器的应用场景:- 数据一致性约束:当某个数据表被更新时,触发器可以用于确保相关的数据的一致性,比如外键约束的实现。
存储过程与函数的区别与联系⼀、函数 函数与存储过程相似,也是数据库中存储的已命名PL-SQL程序块。
函数的主要特征是它必须有⼀个返回值。
通过return来指定函数的返回类型。
在函数的任何地⽅可以通过return expression语句从函数返回,返回类型必须和声明的返回类型⼀致。
⼆、函数和存储过程的优点: 1、共同使⽤的代码可以只需要被编写⼀次,⽽被需要该代码的任何应⽤程序调⽤(.net,c++,java,也可以使DLL库)。
2、这种⼏种编写、⼏种维护更新、⼤家共享的⽅法,简化了应⽤程序的开发维护,提⾼了效率和性能。
3、这种模块化的⽅法使得⼀个复杂的问题、⼤的程序逐步简化成⼏个简单的、⼩的程序部分,进⾏分别编写,因此程序的结构更加清晰,简单,也容易实现。
4、可以在各个开发者之间提供处理数据、控制流程、提⽰信息等⽅⾯的⼀致性。
5、节省内存空间。
它们以⼀种压缩的形式被存储在外存中,当被调⽤时才被放⼊内存进⾏处理。
⽽且多个⽤户在调⽤同⼀个存储过程或函数时,只需要加载⼀次即可。
6、提⾼数据的安全性和完整性。
通过把⼀些对数据的操作⽅到存储过程或函数中,就可以通过是否授予⽤户有执⾏该语句的权限,来限制某些⽤户对数据库进⾏这些操作。
三、函数和存储过程的区别: 1、存储过程⽤户在数据库中完成特定操作或者任务(如插⼊,删除等),函数⽤于返回特定的数据。
2、存储过程声明⽤procedure,函数⽤function。
3、存储过程不需要返回类型,函数必须要返回类型。
4、存储过程可作为独⽴的pl-sql执⾏,函数不能作为独⽴的plsql执⾏,必须作为表达式的⼀部分。
5、存储过程只能通过out和in/out来返回值,函数除了可以使⽤out,in/out以外,还可以使⽤return返回值。
6、sql语句(DML或SELECT)中不可⽤调⽤存储过程,⽽函数可以。
四、适⽤场合: 1、如果需要返回多个值和不返回值,就使⽤存储过程;如果只需要返回⼀个值,就使⽤函数。
数据库⾯试题及答案1. 触发器的作⽤? 触发器是⼀种特殊的存储过程, 主要是通过时间来出发⽽被执⾏的. 它可以强化约束,来维护数据的完整性和⼀致性, 可以跟踪数据库内的操作从⽽不允许未经许可的更新和变化. 可以级联运算2. 什么是存储过程? ⽤什么来调⽤? 存储过程是⼀个预编译的SQL语句, 有点事允许模块化的设计, 只需要创建⼀次,就可以被多次调⽤,如果需要执⾏多次SQL,那么存储过程的速度更快. 可以⽤命令对象来调⽤存储过程. 可以供外部程序调⽤, 如java程序3. 存储过程的有优缺点? 优点: 存储过程是⼀个预编译的SQL语句, 执⾏效率⾼ 放在数据库中,直接调⽤,减少⽹络通信 安全性⾼ 可重复使⽤ 缺点: 移植性差4. 存储过程与函数的区别? 存储过程: 在数据库中完成指定的增删改查操作 申明: procedure 函数: 在编程语⾔中进⾏任务的处理 申明: function5. 索引的作⽤? 和他的优点缺点是什么? 索引就是⼀种特殊的查询表, 数据库的搜索可以利⽤它加速对数据的检索. 类似于现实⽣活中的⽬录. 不需要查找整本书就可以找到想要的结果.6. 什么样的字段适合建⽴索引? 唯⼀, 不为空, 经常被查询的字段 7. 索引的类型有哪些? 逻辑上: 单⾏索引,多⾏索引,唯⼀索引,⾮唯⼀索引,函数索引,域索引. 物理上: 分区索引, ⾮分区索引 B-tree: 正常性B树 反转型B树 bitmap位图索引8. 什么是事务? 什么是锁? 事务就是被绑在⼀起作为⼀个逻辑⼯作单元的SQL语句分组, 如果任何⼀个语句操作失败那么整个操作就会失败, 会回滚到之前的状态.要么全部执⾏, 要么⼀个都不执⾏. 锁: DBMS中, 锁是实现事务的关键.9. 什么叫视图? 游标是什么? 视图就是⼀种虚拟的表, 具有和物理表相同的功能. 可以对视图进⾏增改查操作, 视图通常是⼀个表或多个表的⾏或列的⼦集 游标是遍历结果集的⼀个指针, ⽤来逐条处理数据10. 视图的优缺点? 优点: 对数据的选择性访问 ⽤户可以通过简单的查询从复杂查询中得到结果 维护数据的独⽴性 对相同的数据产⽣不同的视图 缺点: 性能11. 列举⼏种表连接的⽅式,有什么区别? 左连接: 左边为主表表数据全部显⽰, 匹配表的不匹配部分不显⽰ 右连接: 右边为主表表数据全部显⽰, 匹配表的不匹配部分不显⽰ 内连接: 只有两个元素表相匹配的才能在结果集中显⽰ 全外连接: 连接中的不匹配的数据全部会显⽰出来 交叉连接: 笛卡尔乘积, 显⽰的结果是连接表数的乘积12. 主键和外键的区别? 主键在本表中是唯⼀的,不为空的, 外键可以重复和为空. 外键和另外⼀张表相关联, 不能创建对应表中不存在的外键.13. 在数据库中查询语句速度很慢, 如何优化? 建⽴索引 减少表之间的关联 优化SQL语句 简化查询字段14. 数据库三范式是什么? 第⼀范式: 列不可再分 第⼆范式: ⾏可以唯⼀区分, 主键约束 第三范式: 表的⾮主属性不能依赖其他表的⾮主属性外键约束15. union和union all有什么不同? union会删掉重复的记录, union all不会16. varchar2和varchar有什么区别? varchar2是Oracle⾃⼰开发的, ⽬前varchar2和varchar是同义词, 关键点是varchar是可变长度的, 可以根据实际的长度来存储17. oracle和mysql的区别? 库函数不同 Oracle是⽤表空间来管理的, mysql不是 SQL语句不同 分页查询不同18. oracle语句有多少类型? DDL, DML, DCL DDL: 建表,建数据库,建⽴约束,修改约束,权限修改 DML: insert, update, delete DCL: 管理⽤户权限19. oracle的分页查询语句? select * from table where row_num between 1 and 10;20. 从数据库中随机选择50条? select * from (select * from example order by dbms_random.random) where rownum <= 50;21. order by与group by的区别? order by是排序查询 group by是分组查询 having只能在group by之后, 使⽤group by查询的语句需要使⽤聚合函数22. commit在哪⾥会运⽤? Oracle的commit就是DML语句提交数据. 在未提交之前你的操作都是保存在内存中, 没有更新到物理内存中. 执⾏commit从⽤户⾓度来讲就是更新到物理⽂件了. 事实上commit还写⼊了⽇志⽂件23. ⾏转列, 列转⾏怎么转? 使⽤decode函数, 或者使⽤case when语句24. 什么是PL/SQL? PL/SQL是⼀种程序语⾔,叫做过程化SQL语⾔, PL/SQL是对oracle数据库对SQL语句的扩展. 在普通的SQL语句的使⽤上增加了编程语⾔的特点. 通过逻辑判断,循环等操作来实现复杂的功能或者计算. PL/SQL只有Oracle数据库有, mySQL现在不⽀持PL/SQL25. 序列的作⽤? Oracle使⽤序列来⽣成唯⼀的编号, ⽤来处理⼀个表中的⾃增字段.26. 表和视图的关系? 视图其实就是⼀条查询语句, ⽤于显⽰⼀个或多个表或其他视图中的数据, 表就是关系型数据库中实际存储数据⽤的.27. oracle基本数据类型? 字符串 char nchar varchar varchar2 nvarchar2 数字 number integer 浮点 binary_float binary_double float ⽇期时间 date timestamp 字符块 blob clob nclob bfile28. truncate与delete的区别? delete table: 删除内容, 不删除定义, 不释放空间 truncate: 删除内容和定义,释放空间29. oracle获取系统时间? select to_char(sysdate,"yyyy-MM-dd") from dual30. oracle如何去重? 使⽤distinct关键字。
数据库存储过程函数与触发器数据库存储过程、函数与触发器数据库存储过程、函数与触发器是关系型数据库中的重要组件,它们的存在使得数据库的操作和管理更加灵活和高效。
本文将向读者介绍数据库存储过程、函数与触发器的概念、特点以及在实际应用中的使用方法和注意事项。
一、数据库存储过程存储过程是一组预定义的SQL语句集合,可以被多次调用执行。
它能够实现自定义业务逻辑,并且可以提高数据库的性能和安全性。
存储过程通常用于数据的操作和处理,例如插入、更新和删除数据等。
存储过程具有以下特点:1. 可以被多次调用执行,提高了代码的重用性。
2. 存储过程可以在数据库服务器端执行,减少了网络传输的开销,提高了数据操作的效率。
3. 存储过程可以封装复杂的业务逻辑,简化了应用程序的开发和维护工作。
4. 存储过程可以通过参数的传递和返回值的设定,实现更加灵活和动态的数据操作。
使用存储过程时需要注意以下事项:1. 良好的存储过程设计是提高数据库性能的关键,需要注意合理的索引设计和语句优化。
2. 存储过程的安全性需要得到保证,应限制存储过程的调用权限,并对输入参数进行有效性验证。
3. 存储过程的修改和维护需要慎重,应注意兼容性和依赖关系。
二、数据库函数数据库函数是一段可重复使用的代码块,接收输入参数并返回计算结果。
函数可以在查询语句中调用,对数据进行计算和处理。
相比存储过程,函数更加灵活,在某些特定的场景下更加适用。
数据库函数具有以下特点:1. 函数可以接收参数,并可以根据参数的不同返回不同的结果,增加了数据处理的灵活性。
2. 函数可以在查询语句中直接调用,使得数据的计算和查询可以一次完成,提高了查询的效率。
3. 函数可以与其他函数和表达式进行组合使用,实现更加复杂的计算和处理逻辑。
4. 函数可以自定义,满足不同业务的处理需求。
使用数据库函数时需要注意以下事项:1. 函数的设计应符合数据库规范,函数的命名要有意义,参数的设置要明确。
2. 函数的性能需要进行优化,避免函数的嵌套和循环调用,减少函数的执行时间。
触发器、存储过程和函数三者有何区别四什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。
触发器是特殊的存储过程,存储过程需要程序调用,而触发器会自动执行;你所说的函数是自定义函数吧,函数是根据输入产生输出,自定义只不过输入输出的关系由用户来定义。
在什么时候用触发器?要求系统根据某些操作自动完成相关任务,比如,根据买掉的产品的输入数量自动扣除该产品的库存量。
什么时候用存储过程?存储过程就是程序,它是经过语法检查和编译的SQL语句,所以运行特别快。
存储过程和用户自定义函数具体的区别先看定义:存储过程存储过程可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。
存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。
存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
存储过程可包含程序流、逻辑以及对数据库的查询。
它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以出于任何使用SQL 语句的目的来使用存储过程,它具有以下优点:·可以在单个存储过程中执行一系列SQL 语句。
·可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
·存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL 语句快。
用户定义函数函数是由一个或多个Transact-SQL 语句组成的子程序,可用于封装代码以便重新使用。
Microsoft? SQL Server? 2000 并不将用户限制在定义为Transact-SQL 语言一部分的内置函数上,而是允许用户创建自己的用户定义函数。
可使用CREATE FUNCTION 语句创建、使用ALTER FUNCTION 语句修改、以及使用DROP FUNCTION 语句除去用户定义函数。
每个完全合法的用户定义函数名(database_name.owner_name.function_name) 必须唯一。
必须被授予CREATE FUNCTION 权限才能创建、修改或除去用户定义函数。
不是所有者的用户在Transact-SQL 语句中使用某个函数之前,必须先给此用户授予该函数的适当权限。
若要创建或更改在CHECK 约束、DEFAULT 子句或计算列定义中引用用户定义函数的表,还必须具有函数的REFERENCES 权限。
在函数中,区别处理导致删除语句并且继续在诸如触发器或存储过程等模式中的下一语句的Transact-SQL 错误。
在函数中,上述错误会导致停止执行函数。
接下来该操作导致停止唤醒调用该函数的语句。
用户定义函数的类型SQLServer 2000 支持三种用户定义函数:·标量函数·内嵌表值函数·多语句表值函数用户定义函数采用零个或更多的输入参数并返回标量值或表。
函数最多可以有1024 个输入参数。
当函数的参数有默认值时,调用该函数时必须指定默认DEFAULT 关键字才能获取默认值。
该行为不同于在存储过程中含有默认值的参数,而在这些存储过程中省略该函数也意味着省略默认值。
用户定义函数不支持输出参数。
标量函数返回在RETURNS 子句中定义的类型的单个数据值。
可以使用所有标量数据类型,包括bigint和sql_variant。
不支持timestamp数据类型、用户定义数据类型和非标量类型(如table或cursor)。
在BEGIN...END 块中定义的函数主体包含返回该值的Transact-SQL 语句系列。
返回类型可以是除text、ntext、image、cursor和timestamp之外的任何数据类型。
表值函数返回table。
对于内嵌表值函数,没有函数主体;表是单个SELECT 语句的结果集。
对于多语句表值函数,在BEGIN...END 块中定义的函数主体包含TRANSACT-SQL 语句,这些语句可生成行并将行插入将返回的表中。
有关内嵌表值函数的更多信息,请参见内嵌用户定义函数。
有关表值函数的更多信息,请参见返回table 数据类型的用户定义函数。
BEGIN...END 块中的语句不能有任何副作用。
函数副作用是指对具有函数外作用域(例如数据库表的修改)的资源状态的任何永久性更改。
函数中的语句唯一能做的更改是对函数上的局部对象(如局部游标或局部变量)的更改。
不能在函数中执行的操作包括:对数据库表的修改,对不在函数上的局部游标进行操作,发送电子邮件,尝试修改目录,以及生成返回至用户的结果集。
函数中的有效语句类型包括:·DECLARE 语句,该语句可用于定义函数局部的数据变量和游标。
·为函数局部对象赋值,如使用SET 给标量和表局部变量赋值。
·游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。
不允许使用FETCH 语句将数据返回到客户端。
仅允许使用FETCH 语句通过INTO 子句给局部变量赋值。
·控制流语句。
·SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
·INSERT、UPDATE 和DELETE 语句,这些语句修改函数的局部table变量。
·EXECUTE 语句,该语句调用扩展存储过程。
在查询中指定的函数的实际执行次数在优化器生成的执行计划间可能不同。
示例为WHERE 子句中的子查询唤醒调用的函数。
子查询及其函数执行的次数会因优化器选择的访问路径而异。
用户定义函数中不允许使用会对每个调用返回不同数据的内置函数。
用户定义函数中不允许使用以下内置函数:@@CONNECTIONS @@PACK_SENT GETDATE@@CPU_BUSY @@PACKET_ERRORS GetUTCDate@@IDLE @@TIMETICKS NEWID@@IO_BUSY @@TOTAL_ERRORS RAND@@MAX_CONNECTIONS @@TOTAL_READ TEXTPTR@@PACK_RECEIVED @@TOTAL_WRITE架构绑定函数CREATE FUNCTION 支持SCHEMABINDING 子句,后者可将函数绑定到它引用的任何对象(如表、视图和其它用户定义函数)的架构。
尝试对架构绑定函数所引用的任何对象执行ALTER 或DROP 都将失败。
必须满足以下条件才能在CREATE FUNCTION 中指定SCHEMABINDING:·该函数所引用的所有视图和用户定义函数必须是绑定到架构的。
·该函数所引用的所有对象必须与函数位于同一数据库中。
必须使用由一部分或两部分构成的名称来引用对象。
·必须具有对该函数中引用的所有对象(表、视图和用户定义函数)的REFERENCES 权限。
可使用ALTER FUNCTION 删除架构绑定。
ALTER FUNCTION 语句将通过不带WITH SCHEMABINDING 指定函数来重新定义函数。
调用用户定义函数当调用标量用户定义函数时,必须提供至少由两部分组成的名称:SELECT *, MyUser.MyScalarFunction()FROM MyTable可以使用一个部分构成的名称调用表值函数:SELECT *FROM MyTableFunction()然而,当调用返回表的SQL Server 内置函数时,必须将前缀:: 添加至函数名:SELECT * FROM ::fn_helpcollations()可在Transact-SQL 语句中所允许的函数返回的相同数据类型表达式所在的任何位置引用标量函数,包括计算列和CHECK 约束定义。
例如,下面的语句创建一个返回decimal 的简单函数:CREATE FUNCTION CubicVolume-- Input dimensions in centimeters (@CubeLength decimal(4,1), @CubeWidth decimal(4,1), @CubeHeight decimal(4,1) )RETURNS decimal(12,3) -- Cubic Centimeters.ASBEGIN RETURN ( @CubeLength * @CubeWidth * @CubeHeight )END然后可以在允许整型表达式的任何地方(如表的计算列中)使用该函数:CREATE TABLE Bricks ( BrickPartNmbr int PRIMARY KEY, BrickColor nchar(20), BrickHeight decimal(4,1), BrickLength decimal(4,1), BrickWidth decimal(4,1), BrickVolume AS ( dbo.CubicVolume(BrickHeight,BrickLength, BrickWidth) ) )dbo.CubicVolume 是返回标量值的用户定义函数的一个示例。
RETURNS 子句定义由该函数返回的值的标量数据类型。
BEGIN...END 块包含一个或多个执行该函数的Transact-SQL 语句。
该函数中的每个RETURN 语句都必须具有一个参数,可返回具有在RETURNS 子句中指定的数据类型(或可隐性转换为RETURNS 中指定类型的数据类型)的数据值。
RETURN 参数的值是该函数返回的值。