sqlserver中有系统提供的函数,像avg、sum、getdate()等,用户还可以自定义函数。

用户自定义的函数包括:标量函数和表值函数,其中标量函数和系统函数的用法一样,表值函数根据主体的定义方式又可分为内嵌函数和多语句函数。

下面一一介绍语法。

标量函数:

 Create function 函数名(参数)
Returns 返回值数据类型
[with {Encryption | Schemabinding }]
[as]
begin
SQL语句(return变量)
End
注:Schemabinding将函数绑定到它引用的对象上(注:函数一旦绑定,则不能删除、修改,除非删除绑定)

表值函数-内嵌函数:

 create function 函数名(参数)
returns table
[with {Encryption | Schemabinding }]
as
return(一条SQL语句)

表值函数-多语句函数:

 create function 函数名(参数)
returns 表变量名 table (表变量定义)
[with {Encryption | Schemabinding }]
as
begin
SQL语句
end

下面介绍使用方法,使用前先创建几个表用于测试,表如下:

 CREATE TABLE [dbo].[Classes](
[ID] [int] IDENTITY(1,1) NOT NULL primary key,
[ClassName] [nvarchar](50) NOT NULL,
[CreateTime] [datetime] NOT NULL
); CREATE TABLE [dbo].[Students](
[ID] [int] IDENTITY(1,1) NOT NULL primary key,
[Name] [nvarchar](50) NOT NULL,
[ClassId] [int] NOT NULL,
[Age] [int] NOT NULL,
[CreateTime] [datetime] NOT NULL
); CREATE TABLE [dbo].[Courses](
[ID] [int] IDENTITY(1,1) NOT NULL primary key,
[Name] [nvarchar](50) NOT NULL,
[Credit] [float] NOT NULL
); CREATE TABLE [dbo].[StuScores](
[ID] [int] IDENTITY(1,1) NOT NULL primary key,
[StuId] [int] NOT NULL,
[CourseId] [int] NOT NULL,
[Score] [int] NOT NULL
);

例子如下:

 --标量函数:返回某个班级的人数
create function F_GetSomeClassStuCount(@classId int)
returns int
as
begin
declare @rtnCount int
select @rtnCount=count(*) from Students where ClassId=@classId
return @rtnCount
end; select dbo.F_GetSomeClassStuCount(1); --表值函数-内嵌函数:返回某个班级的人员信息 注意此处不需begin-end包裹
create function F_GetSomeClassStruInfo(@classId int)
returns table
as
return (select * from Students where ClassId=@classId); select * from dbo.F_GetSomeClassStruInfo(1); --表值函数-多语句函数:返回某个学生的成绩
create function F_GetSomStuScore(@stuName nvarchar(50))
returns @tmpTb table(
StuName nvarchar(50),
CourseName nvarchar(50),
Score int
)
as
begin
insert into @tmpTb
select s.Name as StuName,c.Name as CourseName,ss.Score
from StuScores ss
left join Students s on ss.StuId=s.ID
left join Courses c on ss.CourseId=c.ID
where s.Name=@stuName
return
end; select * from F_GetSomStuScore('杨过')

sqlserver自定义函数的创建与调用的更多相关文章

  1. SQLServer自定义函数简单演示

    CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ][ type_schema_name. ] par ...

  2. Sqlserver自定义函数Function

    一.FUNCTION: 在sqlserver2008中有3中自定义函数:标量函数/内联表值函数/多语句表值函数,首先总结下他们语法的异同点: 同点:1.创建定义是一样的:                ...

  3. sqlserver自定义函数【粘】

     用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回 用户自定义函数的类型: 标量函数:返回一个标量值 表格值函数{内联表格值函数.多表格值函数}:返回行集(即返回多个值) 1. ...

  4. MySQL 存储函数的创建、调用、查找

    MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数 1.创建存储函数:使用 create function关键字 2.调用存储函数: 3.示例: ...

  5. sqlserver自定义函数与存储过程的区别 实例详解

    分享下sql server自定义函数与存储过程的区别,一起来学习下. 一.自定义函数: 1. 可以返回表变量 2. 限制颇多,包括 不能使用output参数: 不能用临时表: 函数内部的操作不能影响到 ...

  6. sql自定义函数及C#中调用

    1.在C#中调用sql自定义函数 1.1 标量值函数 sql语句调用 select  dbo.GetClassIDWithName(1) string strSql = string.Format(& ...

  7. sqlserver自定义函数(标量值函数,表值函数)

    用户自定义的函数有两类:表值函数.标量值函数. 表值函数:返回值是数据表的函数 调用方式 select  b.*  from tableA a accross apply Fun_BiaoZhiFun ...

  8. SqlServer自定义函数Function中调用with as

    SET QUOTED_IDENTIFIER ON 标识符可以由双引号分隔,而文字必须由单引号分隔 SET QUOTED_IDENTIFIER OFF 标识符不可加引号,且必须遵守所有 Transact ...

  9. oracle 函数的创建和调用

    以下已经测试通过 创建函数: create or replace function get_annual_sal(in_name varchar2) return number is annual_s ...

随机推荐

  1. docker学习使用

    安装什么的就略过了,之前已经整理过,这里就说说自己使用中的一些东西,也是初用,记录下(现在使用win10 64位,使用Docker for Windows直接安装就好[需要专业版win10安装hype ...

  2. IE、FF、Safari、OP不同浏览器兼容报告

    IE.FF.Safari.OP不同浏览器兼容报告 1         浏览器内核简介 Trident IE浏览器(GreenBrowser绿色浏览器, 遨游浏览器....都是IE) Geckos Fi ...

  3. redis学习(二) Redis Hash

    Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿). redis ...

  4. java多线程详解(6)-线程间的通信wait及notify方法

    Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New) ...

  5. co + Generator 写的迭代器 类似 async.whilst

    试着用用Koa,项目里原来有用到async 的whilst 用koa再用async感觉不太舒服,就用Generator+co写了个类似async whist的调用的主体功能,像传参这些没有作到 var ...

  6. Ubuntu系统监控cpu memery 磁盘Io次数 IO速率 网卡 运行时间等信息的采集

    实验室最近在做的项目要做ubuntu系统监控,要获得系统的一些信息并返回给web服务器. web服务器与ubuntu主机的通信我写的程序用的是socket,至于为什么不用java程序ssh到对应的主机 ...

  7. [vb.net]判断窗体是否已打开

    1.使用OpenForms if my.Application.OpenForms.Item("FormName") isnot nothing then搜索 do somethi ...

  8. 1795. Table tennis

    #include<iostream>#include<cmath> using namespace std;int main(){ int n; cin>>n; w ...

  9. JS手机端去除默认自带的选择复制菜单

    在需要的div上添加以下控制-webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: ...

  10. stopImmediatePropagation的应用

    在众多的方法里面,event.stopImmediatePropagation 算是比较少用的一个方法,拼写上感觉一半像 event.stopPropagation.对于stopPropagation ...