自定义函数”是我们平常的说法,而“用户定义的函数”是 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三种自定义函数的更多相关文章

  1. [教程]Delphi 中三种回调函数形式解析

    Delphi 支持三种形式的回调函数 全局函数这种方式几乎是所有的语言都支持的,类的静态函数也可以归为此类,它保存的只是一个函数的代码起始地址指针( Pointer ).在 Delphi 中声明一般为 ...

  2. JS常用的三种匿名函数

    第一种: var f1=function(p1,p2){ return p1+p2; };//将函数赋值给一个变量 alert(f1(1,3)); 匿名函数没法调用,只能赋值给一个变量,由于是赋值语句 ...

  3. 【转载】 Sqlserver中查看自定义函数被哪些对象引用

    Sqlserver数据库中支持自定义函数,包含表值函数和标量值函数,表值函数一般返回多个数据行即数据集,而标量值函数一般返回一个值,在数据库的存储过程中可调用自定义函数,也可在该自定义函数中调用另一个 ...

  4. sqlserver三种分页方式性能比较

    Liwu_Items表,CreateTime列建立聚集索引 第一种,sqlserver2005特有的分页语法 declare @page intdeclare @pagesize intset @pa ...

  5. python教程(三)·自定义函数

    前面介绍了如何使用函数,这一节我们就来学习怎么创建自己的函数! 自定义函数 创建函数非常简单,它使用关键字 "def",下面的代码创建了一个带有一个参数的函数,并使用不同的参数调用 ...

  6. sqlserver 三种恢复模式

    sql server数据库提供了三种恢复模式:完整,简单和大容量日志,这些模式决定了sql server如何使用事务日志,如何选择它要记录的操作,以及是否截断日志.截断事务日志是删除己执行事务并把该日 ...

  7. mssql sqlserver 三种数据表数据去重方法分享

    摘要: 下文将分享三种不同的数据去重方法数据去重:需根据某一字段来界定,当此字段出现大于一行记录时,我们就界定为此行数据存在重复. 数据去重方法1: 当表中最在最大流水号时候,我们可以通过关联的方式为 ...

  8. mysql oracle sqlserver三种数据库count函数返回值不一样

    SQLQuery countSqlQuery = userDAO.createSQLQuery("select count(id) from fhcb_08_tbl_user"); ...

  9. oracle,mysql,SqlServer三种数据库的分页查询的实例。

    MySql: MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如 ...

随机推荐

  1. HackRF实现无线门铃信号分析重放

    文章特点:数据解码方面实在是没什么信心,存在分析错乱的可能性,所幸发出来共同探讨,恳请鞭策. 0x01 概述 这是一款工作在315Mhz频段的无线遥控门铃,根据查阅官方手册以及芯片信息,确定其采用了e ...

  2. IndexOf() LastIndexOf() Contains() StartsWith() EndsWith()方法比较

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  3. 基于HTTP Live Streaming(HLS) 搭建在线点播系统

    1. 为何要使用HTTP Live Streaming 可以参考wikipedia HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体 网络传输协议.是 ...

  4. Linux基础入门(新版)(实验五至实验八)

    实验五 环境变量与文件查找 (环境变量的作用与用法,及几种搜索文件的方法)   一.环境变量   1.变量 (1)常变量与值是一对一的关系 (2)变量的作用域即变量的有效范围(比如一个函数中.一个源文 ...

  5. var functionName = function() {} vs function functionName() {}

    The difference is that functionOne is defined at run-time, whereas functionTwo is defined at parse-t ...

  6. css 中input和select混排对齐问题

    当INPUT.SELECT及用图片做的button放在一起(并排放一起)时,没法子对齐,一个vertical-align:middle就可搞定.

  7. 用jquery将复选框改成单选框

    前提是要包含jquery文件. 相关代码: jQuery(function($) { init_price_checkbox("by_price"); init_price_che ...

  8. shell命令:给当前目录里一个文件压缩一份不包含.svn文件的zip包

    filepath=$(cd ")"; pwd) packagePath="$filepath"/package zipPath="$filepath& ...

  9. Sublime Text 2 安装主题的方法

    主题下载 下载一个主题,例如: https://github.com/hyspace/st2-reeder-theme 里面起作用的文件有两个: Reeder.sublime-theme Earths ...

  10. 【转】apache与tomcat的区别

    Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. Apache是web服 ...