用户自定义函数


  在使用SQL server的时候,除了其内置的函数之外,还允许用户根据需要自己定义函数。根据用户定义函数返回值的类型,可以将用户定义的函数分为三个类别:

  • 返回值为可更新表的函数

  如果用户定义函数包含了单个select语句且语句可更新,则该函数返回的表也可更新,这样的函数称为内嵌表值函数。

  • 返回值不可更新表的函数

  如果用户定义函数包含多个select语句,则该函数返回的表不可更新。这样的函数称为多语句表值函数。

  • 返回标量值的函数

  用户定义函数返回值为标量值,这样的函数称为标量函数。


  在这里需要说明一下,用户定义的函数是可以接受零个或多个输入参数的,函数的返回值可以是一个数值,也可以是一个表。用户定义的函数不支持输出函数;

  利用alter function可以对用户定义函数进行修改,用drop function 可以删除用户定义函数(当然,也可以直接通过图形界面操作进行删除,但这里不多累述);

标量函数的定义与调用

  标量函数定义的语法格式如下: 

  create function [owner_name] function_name
([{@parameter_name [as] scalar_parameter_date_type [=default]}[,…n]])
returns scalar_return_data_type [with encryption] [as]
begin
function_body
return scalar_expression
end

  其中的含义分别如下:

  • owner_name : 数据库所有名。
  • function_name:用户定义函数名,函数名必须符合标示符规范,对其所有者来说,该用户名在数据库中必须是唯一的。
  • @parameter_name:用户定义函数的形参名, create function 语句中可以申明一个或多个参数,用@符号作为第一个字符来指定形参名 ,每个函数的参数局部作用于该函数。
  • scalar_parameter_data_type:参数的数据类型,可为系统支持的基本标量类型,不能为 timestamp 类型、用户定义数据类型、非标量类型(如 cursor 和 tabel)。
  • default:指定默认值。
  • with 子句指出了创建函数的选项,如果指出了 encryption 参数,则创建的函数是被加密的,函数定义的文本将以不可读的形式存储在 syscomments 表中,任何人都不能查看该函数的定义,包括函数的创建者和系统管理员。
  • begin 和 end 之间定义了函数题,该函数体中必须包括一条 return语句,用于返回一个值。函数返回 scalar_expression 表达式的值。
  • scalar_return_data_type:用户定义函数的返回类型,可以是 SQL Server 支持的基本标量类型,但 text 、nterxt 、image 和 timestamp 除外。

  根据上面的解释不妨来自定义一个函数,用来做一个统计 ——

  统计学院学生的机试与笔试的平均成绩

  假设已经有一个 exam 表,表中有 stuno 字段,便于查询。

  还有笔试成绩字段 written 和机试字段 lab ,且已经有记录存在。

 create function getScore(@stuno varchar(20))
returns float as
begin
declare @Score float
set @Score = -1;
selecet @Score = (isnull(written,0)+isnull(lab,0))/2
from exam
where stuno = @stuno
return @Score
end

  

  标量函数的调用:

  当调用用户定义函数的时候,必须要提供至少有两个部分组成的所有名称 (所有者.函数名)。调用用户定义函数的方法有两种:

  1.在 SELECT 语句中调用 ——

  owner_name.function_name (@parameter_name1, 2 ……)

  参数可为赋值的局部变量或表达式,例如:调用用户定义函数 getScore.

select dbo.getScore('');

  2.用 EXEC 语句执行

  用 T-SQL 的 execute 语句调用自定义函数的时候,实参的标识次序与函数定义中的参数标识次序可以不同,其具体调用形式为:

  owner_name.function_name @parameter_name1 , .... @parameter_name_n

  或

  owner_name.function_name @fparameter_name 1 = @aparameter_name1, .... @fparameter_name_n = @aparameter_name_n

  前者实参顺序应该要与函数定义的形参顺序一致,后者实参顺序可以与函数定义的形参书讯不一致。

  如果函数的参数有默认值,在调用该函数的时候必须指定 default 关键字才能获得默认值 , 这不同于存储过程中有默认值的参数,在存储过程中省略参数意味着使用默认值。

  

T-SQL编程 —— 用户自定义函数(标量函数)的更多相关文章

  1. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...

  2. SQL Server ->> 内置标量函数TRY_PARSE、TRY_CAST和TRY_CONVERT的各自特点和区别

    SQL Server到了目前的2014版本有三个函数是用来转换数据格式的.虽说之前版本中已经有CAST和CONVERT这两个函数来干这个事情.问题是,一旦往目标数据类型转换失败就会造成报错. TRY_ ...

  3. PCB 周期计算采用 SQL 函数调用.net Dll 标量函数 实现

    PCB 周期计算采用 SQL函数调用.net Dll实现 (实现代码重用目的) 玩过SQL SERVER数据库经常经需要写存储过程,函数之类的,当业务逻辑过于复杂,用SQL去写简直是恶梦, 这里以PC ...

  4. SQL 表值函数/标量函数

    表值函数 定义表值函数 --定义表值函数 CREATE FUNCTION GetStuScore(@Stu_ID INT ) RETURNS TABLE AS RETURN (SELECT ),[St ...

  5. PL/SQL编程(1) - 存储过程,函数以及参数

    存储过程 PROCEDURE [schema.]name[( parameter[, parameter...] ) ] [AUTHID DEFINER | CURRENT_USER ] [ACCES ...

  6. T-SQL编程 —— 用户自定义函数(内嵌表值函数)

    内嵌表值函数 接上 <T-SQL编程 -- 用户自定义函数(标量函数)> http://www.cnblogs.com/viusuangio/p/6212072.html 内嵌表值函数可以 ...

  7. SQL Server用户自定义函数

    用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统 函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过EXECUTE 命令来执行.在 SQL Server 中根据函数 ...

  8. SQL SERVER 用户自定义函数(UDF)深入解析

    本文内容概要: UDF 概念.原理.优缺点.UDF 的分类 详细讲述3种 UDF 的创建.调用方法以及注意事项 UDF 的实践建议 基本原理: UDF:user-defined functions,用 ...

  9. SQL Server 性能优化之——T-SQL TVF和标量函数

    阅读导航 1. TVF(表-值行数Table-Valued Functions)         a. 创建TVF         b. 使用TVF的低性能T-SQL         c. 使用临时表 ...

随机推荐

  1. Javascript的GET、POST请求

    POST.GET传输数据大小限制 HTTP协议规范没有对URL长度进行限制,也没有限制消息主体的大小,所以从理论上讲,GET.POST是没有大小限制的.那又为什么在使用过程中会有大小限制呢?? GET ...

  2. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  3. 《量化投资:以MATLAB为工具》连载(2)基础篇-N分钟学会MATLAB(中)

    http://www.matlabsky.com/thread-43937-1-1.html   <量化投资:以MATLAB为工具>连载(3)基础篇-N分钟学会MATLAB(下)     ...

  4. 浅谈HTTPS和SSL/TLS协议的背景和基础

    相关背景知识要说清楚HTTPS协议的实现原理,至少要需要如下几个背景知识.大致了解几个基础术语(HTTPS.SSL.TLS)的含义大致了解HTTP和TCP的关系(尤其是"短连接"和 ...

  5. Java注解详解

    Java1.5引入了注解,注解作为程序的元数据嵌入到程序中.注解可以被一些解析工具或者编译工具进行解析.我们也可以声明注解在编译过程或者执行时产生作用. 创建Java自定义注解: package co ...

  6. there are no packages available for installation插件安装问题和如何配置浏览器的快捷键

    sublime text3 在安装插件时,有时候会莫名其妙的弹出如下所示的弹窗(之前遇到了,但写的时候不知道为什么我的又可以了,这个只是出现了这个问题之后可以尝试的一个解决办法,图片就从网上找了一个) ...

  7. Add a Syscall

    Add a syscall to kernel and replace linux kernel of RPi. Prepare: Cross compiler Linux Kernel for RP ...

  8. C# Linq 交集、并集、差集、去重

    using System.Linq;         List<string> ListA = new List<string>(); List<string> L ...

  9. LAMP环境搭建

    安装前说明: 先安装gcc gcc-c++ make 等 可用yum install -y gcc gcc-c++ make 也可以使用rpm安装不过需要注意依赖 1.安装apache 下载链接:ht ...

  10. IOS程序启动原理

    1.Info.plist 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 常见属性(红色 ...