SQLServer三种自定义函数
自定义函数”是我们平常的说法,而“用户定义的函数”是 SQL Server 中书面的说法。
SQL Server 2000 允许用户创建自定义函数,自定义函数可以有返回值。
自定义函数分为:标量值函数或表值函数
- 如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数。可以使用多条 Transact-SQL 语句定义标量值函数。
- 如果 RETURNS 子句指定 TABLE,则函数为表值函数。
表值函数又可分为:内嵌表值函数(行内函数)或多语句函数
- 如果 RETURNS 子句指定的 TABLE 不附带列的列表,则该函数为内嵌表值函数。
- 如果 RETURNS 子句指定的 TABLE 类型带有列及其数据类型,则该函数是多语句表值函数。
标量值函数示例
CREATE FUNCTION dbo.Foo()
RETURNS int
AS
BEGIN
declare @n int
select @n=3
return @n
END
内嵌表值函数示例
CREATE FUNCTION dbo.Foo()
RETURNS TABLE
AS
return select id, title from msgs
内嵌表值函数只有一个 select 语句。
多语句表值函数示例(部分)
CREATE FUNCTION fn_FindReports (@InEmpId nchar(5))
RETURNS @retFindReports TABLE (empid nchar(5) primary key,
empname nvarchar(50) NOT NULL,
mgrid nchar(5),
title nvarchar(30))
...
注意其 RETURNS 部分。
多语句函数的主体中允许使用以下语句。未在下面的列表中列出的语句不能用在函数主体中。
- 赋值语句。
- 控制流语句。
- DECLARE 语句,该语句定义函数局部的数据变量和游标。
- SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
- 游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句;不允许使用将数据返回到客户端的 FETCH 语句。
- INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。
- EXECUTE 语句调用扩展存储过程。
自己写的例子标量值函数示例:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CREATE FUNCTION CheckSalary(@salary nvarchar(100))
RETURNS nvarchar(50) AS
BEGIN
declare @salarys nvarchar(50)
select @salarys=(
select B.B_Name from OriginSalary as B join AddSalary as A on B.B_ID=A.A_ID whereB.B_ID = @salary
)
return @salarys
END
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在查询分析器里面调用:select dbo.CheckSalary('Y2007001') 即可,记住一定要写所有者用的这里是dbo即所有系统使用者都可以调用该函数
自己写的例子多语句表值函数示例:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CREATE FUNCTION CheckTables(@B_ID nvarchar(10))
RETURNS @CheckTables table(B_Name nvarchar(10),B_Salary nvarchar(10))
AS
BEGIN
IF @B_ID='Y2007001'
insert @CheckTables
select B_Name,B_Salary from OriginSalary where B_ID=@B_ID
ELSE IF
insert @CheckTables
select B_Name,B_Salary from OriginSalary where B_ID=@B_ID
--注释:虽然这条语句与上一条一样,但这里只想说明一个问题,可以使用多条SQL语句,这就是多语句表值的特
--性,在后面会写内嵌套表的方法(内嵌表值函数只有一个 select 语句),今天累了,明天继续
return
--这里别忘记返回(return)了否则无值返回查询语句
END
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
查询分析器调用:select * from dbo.CheckTables('Y2007001')
注:insert @CheckTables 必须含有,否则select无法返回客户端数据
自己写的例子内嵌表值函数示例:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CREATE FUNCTION CheckSalaryInRegion(@RegionParameter nvarchar(10))
RETURNS table AS
return(
select B.B_Name,B.B_Salary from OriginSalary as B join AddSalary as A
on B.B_ID = A.A_ID where B.B_ID=@RegionParameter
)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
查询分析器调用:select * from dbo.CheckSalaryInRegion('Y2007001')
注:内嵌表值函数只有一个 select 语句,而且没有BEGIN 和 END
上面这段是自己写的,简单的理解就是这样,传一个参数,这里传参数与编程有点不同,数据库是先定义变量名称,然后再写类型。


AddSalary表 OriginSalary表
原文地址:http://liangfen1224.blog.163.com/blog/static/7237764720100584551415/
SQLServer三种自定义函数的更多相关文章
- [教程]Delphi 中三种回调函数形式解析
Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...
- JS常用的三种匿名函数
第一种: var f1=function(p1,p2){ return p1+p2; };//将函数赋值给一个变量 alert(f1(1,3)); 匿名函数没法调用,只能赋值给一个变量,由于是赋值语句 ...
- 【转载】 Sqlserver中查看自定义函数被哪些对象引用
Sqlserver数据库中支持自定义函数,包含表值函数和标量值函数,表值函数一般返回多个数据行即数据集,而标量值函数一般返回一个值,在数据库的存储过程中可调用自定义函数,也可在该自定义函数中调用另一个 ...
- sqlserver三种分页方式性能比较
Liwu_Items表,CreateTime列建立聚集索引 第一种,sqlserver2005特有的分页语法 declare @page intdeclare @pagesize intset @pa ...
- python教程(三)·自定义函数
前面介绍了如何使用函数,这一节我们就来学习怎么创建自己的函数! 自定义函数 创建函数非常简单,它使用关键字 "def",下面的代码创建了一个带有一个参数的函数,并使用不同的参数调用 ...
- sqlserver 三种恢复模式
sql server数据库提供了三种恢复模式:完整,简单和大容量日志,这些模式决定了sql server如何使用事务日志,如何选择它要记录的操作,以及是否截断日志.截断事务日志是删除己执行事务并把该日 ...
- mssql sqlserver 三种数据表数据去重方法分享
摘要: 下文将分享三种不同的数据去重方法数据去重:需根据某一字段来界定,当此字段出现大于一行记录时,我们就界定为此行数据存在重复. 数据去重方法1: 当表中最在最大流水号时候,我们可以通过关联的方式为 ...
- mysql oracle sqlserver三种数据库count函数返回值不一样
SQLQuery countSqlQuery = userDAO.createSQLQuery("select count(id) from fhcb_08_tbl_user"); ...
- oracle,mysql,SqlServer三种数据库的分页查询的实例。
MySql: MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如 ...
随机推荐
- FineUI疑难杂症
1. 导出excel操作:因为fineui里的按钮自带异步功能,所以要把 EnableAjax="false" DisableControlBeforePostBack=" ...
- 使用HackRF+GNU Radio 破解吉普车钥匙信号
引文 我最近对软件定义的无线电技术(SDR)产生了浓厚的兴趣,而我对其中一款流行的SDR平台(HackRF)也产生了兴趣,而其频率接收的范围也在1MHz ~6GHz之间(范围较广).而这里也需要提及一 ...
- 刷固件Layer1到手机FLASH(硬刷)
开头: 注意:本文章并不是做GSM 嗅探必须的,平时我们刷机叫软刷是刷到内存里面的,断电就消失了,这个是硬刷,刷到flash里面的,断电不消失,开机就运行的. 本文章经过作者实测可行,这只是单个应用程 ...
- VBS_For Each...Next
For Each...Next 循环与 For...Next 循环类似.For Each...Next 不是将语句运行指定的次数,而是对于数组中的每个元素或对象集合中的每一项重复一组语句.这在不知道集 ...
- JavaScript封装的几种方式
JS 对象封装的常用方式 JS是一门面向对象语言,其对象是用prototype属性来模拟的.来看看如何封装JS对象. 常规封装 function Person (name,age,sex){ this ...
- 利用NTP搭建自己的ntp服务
利用NTP搭建自己的ntp服务 发表于 2013 年 9 月 22 日 作者 admin 对于校园网/企业用户,如果您网内所有计算机都通过互联网同步时间,在速度和精度上都有一定的折扣,并且对互联网出口 ...
- 学习笔记:只有一套app设计稿(5s尺寸)切出4和4s尺寸以及安卓系统主流尺寸的图
如何在只有一套app设计稿(5s尺寸)切出4和4s尺寸以及安卓系统主流尺寸的图 转自:http://www.zhihu.com/question/23255417 版权归原作者所有 目前ios手机 ...
- 8、网页制作Dreamweaver(jQuery基础:安装、语法)
在<网页制作Dreamweaver(悬浮动态分层导航)>中,运用到了jQuery的技术,轻松实现了菜单的下拉.显示.隐藏的效果,不必再用样式表一点点地修改,省去了很多麻烦,那么jQuery ...
- 图例解析四大UML关系【转】
转自http://developer.51cto.com/art/201007/209644.htm 本文和大家重点讨论一下UML关系图,UML中有五类图,共有九种图形,UML类之间的UML关系图你是 ...
- [转载]Magento 店铺多语言设置
本文以扩展中文包为例: 首先进入自己 Magento 后台 系统 -> 管理商店(System -> Manage Stores) 单击 “创建店铺视图”(Create Store Vie ...