SQL用户自定义函数

— — —
— —
— —
DECLARE语句,该语句可用于定义函数局部的数据变量和游标。 DECLARE语句,该语句可用于定义函数局部的数据变量和游标。 语句 为函数局部对象的赋值,如使用SET为标量和表局部变量赋值。 SET为标量和表局部变量赋值 为函数局部对象的赋值,如使用SET为标量和表局部变量赋值。 游标操作,该操作引用在函数中声明、打开、 游标操作,该操作引用在函数中声明、打开、关闭和释放的局部 游标。不允许使用FETCH语句将数据返回到客户端; FETCH语句将数据返回到客户端 游标。不允许使用FETCH语句将数据返回到客户端;仅允许使用 FETCH语句通过INTO子句给局部变量赋值 语句通过INTO子句给局部变量赋值。 FETCH语句通过INTO子句给局部变量赋值。 TRY...CATCH语句以外的流控制语句。 TRY...CATCH语句以外的流控制语句。 语句以外的流控制语句 SELECT语句 语句, SELECT语句,该语句包含具有为函数的局部变量赋值的表达式的 选择列表。 选择列表。 INSERT、UPDATE和DELETE语句 这些语句修改函数的局部表变量。 语句, INSERT、UPDATE和DELETE语句,这些语句修改函数的局部表变量。 EXECUTE语句 该语句调用扩展存储过程。 语句, EXECUTE语句,该语句调用扩展存储过程。 上一页 下一页 返 回
上一页
下一页
返 回
第10章 用户定义函数
10.1 用户定义函数
SQL Server用户定义函数是接受参数、执行操作(例如复 Server用户定义函数是接受参数 执行操作( 用户定义函数是接受参数、 杂计算) 并将操作结果以值的形式返回的例程。 杂计算),并将操作结果以值的形式返回的例程。 可以通过SQL Server设计用户定义函数 设计用户定义函数, 可以通过SQL Server设计用户定义函数,来补充和扩展系 统支持的内置函数。 统支持的内置函数。用户定义函数可接受零个或多个输入参 返回标量值或表。 数,返回标量值或表。 在 SQL Server中使用用户定义函数有以下优点: Server中使用用户定义函数有以下优点: 中使用用户定义函数有以下优点 允许模块化程序设计。 允许模块化程序设计。 执行速度更快。 执行速度更快。 减少网络流量。 减少网络流量。
第10章 用户定义函数
10.2 创建用户定义函数
用户定义函数的结构有两部分组成:标题和正文。 用户定义函数的结构有两部分组成:标题和正文。 标题定义: 标题定义: — 具有可选架构/所有者名称的函数名称; 具有可选架构/所有者名称的函数名称; — 输入参数名称和数据类型; 输入参数名称和数据类型; — 可以用于输入参数的选项; 可以用于输入参数的选项; — 返回参数数据类型和可选名称; 返回参数数据类型和可选名称; — 可以用于返回参数的选项。 可以用于返回参数的选项。
第10章 用户定义函数
10.2.2 创建用户定义表值函数 10.
返回table数据类型的用户定义表值函数功能强大,可以替代视图。 返回table数据类型的用户定义表值函数功能强大,可以替代视图。 数据类型的用户定义表值函数功能强大 — 表值用户定义函数还可以替换返回单个结果集的存储过程。 表值用户定义函数还可以替换返回单个结果集的存储过程。 创建多语句表值函数的语法格式为: 创建多语句表值函数的语法格式为: CREATE FUNCTION [ schema_name. ] function_name schema_name. ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS @return_variable TABLE < table_type_definition > [ WITH { [ ENCRYPTION ] | [ SCHEMABINDING ] } [ ,...n ] ] [ AS ] BEGIN function_body RETURN END [ ; ]
上一页
下一页
返 回
第10章 用户定义函数 SQL Server 2008支持用户定义函数和内置系统函数。 2008支持用户定义函数和内置系统函数 支持用户定义函数和内置系统函数。 标量函数 用户定义标量函数返回在RETURNS子句中定义的类型的单个数据值。 用户定义标量函数返回在RETURNS子句中定义的类型的单个数据值。 表值函数 —用户定义表值函数返回table数据类型。 用户定义表值函数返回table数据类型。 —表值函数可以分为内联表值函数或多语句表值函数。内联表值函 表值函数可以分为内联表值函数或多语句表值函数。 数 , 没有函数主体, 表是单个 SELECT语句的结果集 。 多语句表值 没有函数主体 , 表是单个SELECT 语句的结果集。 函数, BEGIN...END语句块中定义的函数体包含一系列Transact函数,在BEGIN...END语句块中定义的函数体包含一系列Transact-SQL 语句,这些语句可生成行并将其插入将返回的表中。 语句,这些语句可生成行并将其插入将返回的表中。 内置函数 SQL Server提供了内置函数来帮助执行各种操作。这些函数不能修 Server提供了内置函数来帮助执行各种操作。这些函数不能修 改。可以在 Transact-SQL语句中使用内置函数,完成以下操作: Transact-SQL语句中使用内置函数,完成以下操作: —从SQL Server系统表中访问信息而不直接访问系统表。例如函数 Server系统表中访问信息而不直接访问系统表。例如函数 DB_ID、DB_NAME或OBJECT_ID等。 DB_ID、DB_NAME或OBJECT_ID等。 —执行常见任务,例如SUM、GETDATE或IDENTITY。 执行常见任务,例如SUM、GETDATE或IDENTITY。 内置函数返回标量数据类型或table数据类型。 内置函数返回标量数据类型或table数据类型。 上一页 下一页 返 回
第10章 用户定义函数 【例10-1】 在数据库CJMS中创建用户定义标量函数fn_EvaluateOneStudent, 10在数据库CJMS中创建用户定义标量函数 中创建用户定义标量函数fn_EvaluateOneStudent, 要求:每次输入一个学号,计算该学生的所有课程的平均分, 要求:每次输入一个学号,计算该学生的所有课程的平均分,如果是 CREATE FUNCTION fn_EvaluateOneStudent(@StudentID char(10)) 85~100分 varchar(10) 85~100分,返回“优”;如果是75~84分,返回“良”;如果是65~74分,返 如果是75~84分 返回“ 如果是65~74分 RETURNS 返回“ 如果是0~64分 返回“ 如果该学生没有成绩,返回“ 回“中”;如果是0~64分,返回“差”;如果该学生没有成绩,返回“无 AS 成绩” 成绩”。 BEGIN DECLARE @平均分 decimal(3,1), @等级 varchar(10) SELECT @平均分=AVG(Grade) FROM tblScore WHERE StudentID=@StudentID SET @等级=CASE @ =CASE WHEN @平均分 BETWEEN 85 AND 100 THEN '优' WHEN @平均分 BETWEEN 75 AND 84 THEN '良' WHEN @平均分 BETWEEN 65 AND 74 THEN '中' WHEN @平均分 BETWEEN 0 AND 64 THEN '差' ELSE '无成绩' END RETURN @等级 END; GO 上一页 回
第10章 用户定义函数 @return_variable:是TABLE变量,用于存储和汇总应作为函数值返回 的行。 — TABLE:指定表值函数的返回值为表。 — < table_type_definition >:表变量的定义。类同于使用CREATE TABLE 语句创建表时,表结构的定义。 CREATE FUNCTION fn_NameStyle(@length char(9)) —RETURNS @fn_Students TABLE function_body:指定一系列定义函数值的Transact-SQL语句,这些语句 将填充TABLE返回变量。 KEY NOT NULL, (StudentID char(10) PRIMARY 10创建多语句表值函数fn_NameStyle, [Student 创建多语句表值函数fn_NameStyle,该函数根据提供的参数返 【例10-2】Name] char(8) NOT NULL) 回所有学生的姓或姓名。 回所有学生的姓或姓名。 AS BEGIN IF @length='ShortName' INSERT @fn_Students SELECT StudentID,LEFT(Sname,1) FROM tblStudents ELSE IF @length='LongName' INSERT @fn_Students SELECT StudentID,Sname FROM tblStudents RETURN END;
上一页
下一页
返 回
第10章 用户定义函数
正文定义了函数将要执行的操作或逻辑。包括执行函数逻 正文定义了函数将要执行的操作或逻辑。 辑的一个或多个Transact SQL语句 Transact语句。 辑的一个或多个Transact-SQL语句。 在函数定义中可使用的有效语句包括: 在函数定义中可使用的有效语句包括:
第10章 用户定义函数
— — — — — — — — — —
— —
schema_name:用户定义函数所属的架构的名称。 function_name:用户定义函数的名称。 @parameter_name:用户定义函数的参数。 [ type_schema_name. ] parameter_data_type:参数的数据类型及其所 属的架构。 [ = default ]:参数的默认值。 READONLY:指示不能在函数定义中更新或修改参数。 return_data_type return_data_type:标量用户定义函数的返回值的数据类型。 ENCRYPTION:指示数据库引擎 对包含CREATE FUNCTION语句文本 的目录视图列进行加密。 SCHEMABINDING:指定将函数绑定到其引用的数据库对象。 RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT:指定 标量值函数的 OnNULLCall属性。如果未指定,则默认为CALLED ON NULL INPUT,这意味着即使传递的参数为NULL,也将执行函数体。 function_body:指定一系列定义函数值的Transact-SQL语句,这些语句 一起使用的计算结果为标量值。 scalar_expression:指定标量函数返回的标量值。 上一页 下一页 返 回
合集下载

sql 自定义函数的使用方法及实例大全

sql 自定义函数的使用方法及实例大全

SQL 自定义函数是指用户根据自己的需求编写的函数,这些函数可以完成特定的数据处理和计算任务。

在数据库管理系统中,通过自定义函数可以实现对数据的灵活操作和处理,极大地扩展了 SQL 的功能和应用范围。

本文将介绍 SQL 自定义函数的使用方法及实例,并对不同的场景进行详细的讲解和示范。

一、SQL 自定义函数的基本语法1. 创建函数:使用 CREATE FUNCTION 语句来创建自定义函数,语法如下:```sqlCREATE FUNCTION function_name (parameters)RETURNS return_typeASbeginfunction_bodyend;```2. 参数说明:- function_name:函数的名称- parameters:函数的参数列表- return_type:函数的返回类型- function_body:函数的主体部分,包括具体的逻辑和计算过程3. 示例:```sqlCREATE FUNCTION getAvgScore (class_id INT)RETURNS FLOATASbeginDECLARE avg_score FLOAT;SELECT AVG(score) INTO avg_score FROM student WHERE class = class_id;RETURN avg_score;end;```二、SQL 自定义函数的使用方法1. 调用函数:使用 SELECT 语句调用自定义函数,并将其结果用于其他查询或操作。

```sqlSELECT getAvgScore(101) FROM dual;```2. 注意事项:- 自定义函数可以和普通SQL 查询语句一样进行参数传递和结果返回;- 要确保函数的输入参数和返回值的数据类型匹配和合理;- 函数内部可以包含复杂的计算逻辑和流程控制语句。

三、SQL 自定义函数的实例大全1. 计算平均值:通过自定义函数来计算学生某门课程的平均分数。

sql 自定义函数 写法

sql 自定义函数 写法

sql 自定义函数写法在SQL中,可以使用自定义函数来实现特定的功能,提高代码的复用性和可维护性。

下面我将介绍自定义函数的一般写法。

首先,我们需要使用CREATE FUNCTION语句来创建自定义函数。

其一般语法如下:sql.CREATE FUNCTION function_name (parameter1 data_type, parameter2 data_type, ...)。

RETURNS return_data_type.AS.BEGIN.-函数体,包括具体的业务逻辑。

END;在这个语法中,function_name是函数的名称,parameter1、parameter2等是函数的参数,它们指定了函数接受的输入。

return_data_type是函数返回的数据类型。

AS关键字之后是函数体,包括具体的业务逻辑。

例如,下面是一个简单的自定义函数示例,用于计算两个数的和:sql.CREATE FUNCTION calculate_sum (a INT, b INT)。

RETURNS INT.AS.BEGIN.DECLARE result INT;SET result = a + b;RETURN result;END;在这个示例中,calculate_sum是函数的名称,它接受两个整数参数a和b,并返回一个整数类型的结果。

函数体内部使用DECLARE关键字声明了一个局部变量result,然后计算a和b的和并将结果赋给result,最后通过RETURN语句返回结果。

需要注意的是,不同的数据库系统对于自定义函数的语法和特性可能略有不同,上述示例是通用的SQL语法,具体的细节可能会因数据库而异。

总的来说,自定义函数的写法包括函数名、参数、返回类型以及函数体的具体实现,通过合理设计和编写自定义函数,可以提高SQL代码的可读性和可维护性。

在SQL中使用自定义函数

在SQL中使用自定义函数

在SQL中使用自定义函数1.使用CREATEFUNCTION语句:CREATEFUNCTION语句用于定义一个新的函数。

在这个语句中,我们需要指定函数的名称、参数列表、返回值类型以及函数体。

例如,下面是一个简单的示例:```CREATE FUNCTION calculate_age(birth_date DATE)RETURNSINTBEGINDECLARE age INT;SET age = TIMESTAMPDIFF(YEAR, birth_date, CURDATE();RETURN age;END;```在上面的示例中,我们定义了一个名为calculate_age的函数,它接受一个日期参数birth_date,并返回一个整数类型的年龄。

2.使用CREATEORREPLACEFUNCTION语句:CREATEORREPLACEFUNCTION 语句用于定义一个新的函数,如果函数已存在,则替换现有的函数定义。

这在需要更新函数定义时非常有用。

例如,下面是一个使用CREATEORREPLACEFUNCTION语句定义的示例:```CREATE OR REPLACE FUNCTION calculate_age(birth_date DATE)RETURNSINTBEGINDECLARE age INT;SET age = TIMESTAMPDIFF(YEAR, birth_date, CURDATE();RETURN age;END;```在上面的示例中,我们定义了一个名为calculate_age的函数,它与前面的示例相同,但使用了CREATE OR REPLACE FUNCTION语句。

3.使用DROPFUNCTION语句删除函数:DROPFUNCTION语句用于从数据库中删除一个函数。

例如,下面是一个使用DROPFUNCTION语句删除函数的示例:```DROP FUNCTION IF EXISTS calculate_age;```在上面的示例中,我们使用DROP FUNCTION语句删除了名为calculate_age的函数。

T_sql中的用户自定义函数及其应用

T_sql中的用户自定义函数及其应用

T_sql中的用户自定义函数及其应用作者:桂云秋张业展朱臣来源:《科教导刊·电子版》2016年第32期摘要设计用户定义函数时,首先要确定最适合自己需要的函数类型。

用户自定函数分为两种,一是返回一个标量(单个值)的函数,称为标量函数,另外一种是返回一个表(多行)的函数,称为表值函数。

关键词 Sql语句自定义函数有段中图分类号:TP311.12 文献标识码:A与编程语言中的函数类似,Microsoft SQL Server 用户定义函数是接受参数、执行操作(例如复杂计算)并将操作结果以值的形式返回的例程。

返回值可以是单个标量值或结果集。

设计用户定义函数时,首先要确定最适合自己需要的函数类型。

用户自定函数分为两种,一是返回一个标量(单个值)的函数,称为标量函数,另外一种是返回一个表(多行)的函数,称为表值函数。

下面分别说明。

1标量函数用户定义标量函数返回在 RETURNS 子句中定义的类型的单个数据值。

对于内联标量函数,没有函数体;标量值是单个语句的结果。

对于多语句标量函数,定义在 BEGIN...END 块中的函数体包含一系列返回单个值的 Transact-SQL 语句。

返回类型可以是除 text、ntext、image、cursor 和 timestamp 外的任何数据类型。

以下示例创建了一个多语句标量函数。

此函数输入一个值 ProductID,而返回一个单个数据值(指定库存产品的聚合量)。

IF OBJECT_ID (N'dbo.ufnGetInventoryStock', N'FN') IS NOT NULLDROP FUNCTION ufnGetInventoryStock;CREATE FUNCTION dbo.ufnGetInventoryStock(@ProductID int)RETURNS intASBEGINDECLARE @ret int;SELECT @ret = SUM(p.Quantity)FROM Production.ProductInventory pWHERE p.ProductID = @ProductIDAND p.LocationID = '6';IF (@ret IS NULL)SET @ret = 0;RETURN @ret;END;下例使用 ufnGetInventoryStock 函数返回 ProductModelID 为 75 到 80 之间的产品的当前库存量。

用户自定义函数

用户自定义函数
*
第16章 用户自定义函数
BRAND PLANING
商业产品部
*
16.1 用户自定义函数的基本概念
BRAND PLANING
SQL Server允许创建用户定义函数 用户定义函数是可返回值的例程
用户定义函数种类
返回可更新数据表的函数
返回不可更新数据表的函数
返回标量值的函数
若函数含单个SELECT语句且可更新,则返回的数据表可更新
例:删除在Northwind库上创建的自定义函数my_function1 DROP FUNCTION my_function1
16.4.3 设置用户自定义函数的权限
1
2
3
设置自定义函数的权限类似于设置表或其他数据库对象的权限
要为用户授予 CREATE FUNCTION 权限
才能进行创建、修改或删除自定义函数的操作
16.2.2 查看用户自定义函数
自定义函数的名称保存在sysobjects系统表中
创建自定义函数的源代码保存在syscomments系统表中
02
*
1.使用系统存储过程查看
EXEC sp_help(sp_helptext) <function-name>
1
例:用系统存储过程sp_helptext 查看用户自定义函数my_funciton1的定义文本信息 USE Northwind go EXEC sp_helptext my_function1 go
标量函数返回在 RETURNS子句中定义的数据类型的单个数据值
标量函数可重复调用
02
01
*
例:创建标量函数,要求将当前系统日期转化为年月日格式的字符串并返回,且默认的分隔符为 ‘ :: ’ ,并允许用户自行定义分隔符

T-SQL编程——用户自定义函数(标量函数)

T-SQL编程——用户自定义函数(标量函数)

T-SQL编程——⽤户⾃定义函数(标量函数)⽤户⾃定义函数 在使⽤SQL server的时候,除了其内置的函数之外,还允许⽤户根据需要⾃⼰定义函数。

根据⽤户定义函数返回值的类型,可以将⽤户定义的函数分为三个类别:返回值为可更新表的函数 如果⽤户定义函数包含了单个select语句且语句可更新,则该函数返回的表也可更新,这样的函数称为内嵌表值函数。

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

这样的函数称为多语句表值函数。

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

在这⾥需要说明⼀下,⽤户定义的函数是可以接受零个或多个输⼊参数的,函数的返回值可以是⼀个数值,也可以是⼀个表。

⽤户定义的函数不⽀持输出函数; 利⽤alter function可以对⽤户定义函数进⾏修改,⽤drop function 可以删除⽤户定义函数(当然,也可以直接通过图形界⾯操作进⾏删除,但这⾥不多累述);标量函数的定义与调⽤ 标量函数定义的语法格式如下: 1create function[owner_name] function_name2 ([{@parameter_name [as] scalar_parameter_date_type [=default]}[,…n]])3returns scalar_return_data_type [with encryption][as]4begin5 function_body6return scalar_expression7end 其中的含义分别如下:owner_name : 数据库所有名。

function_name:⽤户定义函数名,函数名必须符合标⽰符规范,对其所有者来说,该⽤户名在数据库中必须是唯⼀的。

@parameter_name:⽤户定义函数的形参名, create function 语句中可以申明⼀个或多个参数,⽤@符号作为第⼀个字符来指定形参名,每个函数的参数局部作⽤于该函数。

SQL自定义函数


SQL函数 SQL函数
系统函数 —标量函数 标量函数
系统函数 标量函数 聚合函数 行集函数。 行集函数。 标量函数 标量函数对单一值操作,返回单一值。 标量函பைடு நூலகம்对单一值操作,返回单一值。只要在能够使用表达式的 地方,就可以使用标量函数。 地方,就可以使用标量函数。 数学函数 日期和时间函数 字符串函数 数据类型转换函数 。
SQL函数 SQL函数
系统函数—标量函数 标量函数
数学函数 5、 rand(整型表达式 整型表达式) 、 整型表达式 功能:返回一个位于0和 之间的随机数 之间的随机数, 功能:返回一个位于 和1之间的随机数,在单个查询中反复调用 rand( )将产生相同的值。 将产生相同的值。 将产生相同的值 例:DECLARE @counter smallint SET @counter = 1 WHILE @counter < 5 BEGIN SELECT RAND(@counter) Random_Number SET NOCOUNT ON SET @counter = @counter + 1 SET NOCOUNT OFF END GO
SQL函数 SQL函数
系统函数—标量函数 标量函数
数学函数 1、abs(数值型表达式 数值型表达式) 、 数值型表达式 功能: 的绝对值,其值的数据类型与参数一致。 功能:返回表达式 的绝对值,其值的数据类型与参数一致。 例:SELECT ABS(-1), ABS(0), ABS(1) 2、ceiling(数值型表达式 数值型表达式) 、 数值型表达式 功能:返回最小的大于或等于给定数值型表达式的整数值, 功能:返回最小的大于或等于给定数值型表达式的整数值,值的 类型和给定的值相同。 类型和给定的值相同。 floor(数值型表达式 数值型表达式) 数值型表达式 功能:返回最大的小于或等于给定数值型表达式的整数值。 功能:返回最大的小于或等于给定数值型表达式的整数值。 例:SELECT FLOOR(123.45),CEILING(123.45) SELECT FLOOR(-123.45), CEILING(-123.45)

实验八(上):SQL-Server用户自定义函数和触发器

实验八(上)用户自定义函数和触发器一、实验目的1、掌握SQLServer中用户自定义函数的使用方法。

2、掌握SQL Server中触发器的使用方法。

二、实验内容和要求1.创建一个返回标量值的用户定义函数RectangleArea:输入矩形的长和宽就能计算矩形的面积。

自选2种实例调用该函数。

create function RectangleArea(@a int,@b int)returns intasbeginreturn @a*@benddeclare @area intexecute @area=RectangleArea 3,5print('矩形面积是:')print @areadeclare @area intexecute @area=RectangleArea 7,8print('矩形面积是:')print @area2.创建一个用户自定义函数(内嵌表值函数),功能为产生某个系的学生选修信息,内容为学号,姓名,课程名,成绩。

调用这个函数,显示信息系有选课学生的信息。

create function Search (@sdept char(10))returns tableasreturn(select sc.sno 学号,student.sname 姓名,ame 课程名,sc.grade 成绩,student.sdept 系别from sc,student,course where o=o andsc.sno = student.sno and sdept=@sdept)select*from Search('cs')3.创建一个作用在P表上的触发器P_checks,确保用户在插入或更新P表的WEIGHT值时,所提供的WEIGHT值介于20与40之间,否则给出错误提示并回滚此操作。

请测试该触发器,测试方法自定。

create trigger P_checks on p for insertasbegindeclare @weight intselect @weight=weight from insertedif @weight<10 or @weight>20beginRAISERROR('weight 必须在~20之间!',16,1)ROLLBACK TRANSACTIONendendinsert into p(pno,pname,color,weight)values('p7','刀片','红',40)insert into p(pno,pname,color,weight)values('p7','刀片','红',15)select*from p4.创建一个作用在J表上的触发器J_Update,禁止同时修改项目的名称和所在城市,并进行相应的错误提示。

求日期所属星座的T-SQLUDF(用户自定义函数)

求⽇期所属星座的T-SQLUDF(⽤户⾃定义函数)use northwindgocreate function udf_GetStar (@ datetime)returns varchar(100)-- 返回⽇期所属星座,如果有静态的星座对照码表直接在查询中 join 效率相对更⾼beginreturn(--declare @ datetime--set @ = getdate()select max(star)from(select '魔羯座' as star,1 as [month],1 as [day]union all select '⽔瓶座',1,20union all select '双鱼座',2,19union all select '牡⽺座',3,21union all select '⾦⽜座',4,20union all select '双⼦座',5,21union all select '巨蟹座',6,22union all select '狮⼦座',7,23union all select '处⼥座',8,23union all select '天秤座',9,23union all select '天蝎座',10,24union all select '射⼿座',11,22union all select '魔羯座',12,22) starswhere [month] * 40 + [day]=(select max([month] * 40 + [day])from (select '魔羯座' as star,1 as [month],1 as [day]union all select '⽔瓶座',1,20union all select '双鱼座',2,19union all select '牡⽺座',3,21union all select '⾦⽜座',4,20union all select '双⼦座',5,21union all select '巨蟹座',6,22union all select '狮⼦座',7,23union all select '处⼥座',8,23union all select '天秤座',9,23union all select '天蝎座',10,24union all select '射⼿座',11,22union all select '魔羯座',12,22) starswhere [month] * 40 + [day] <= month(@) * 40 + day(@)))endgoCREATE FUNCTION GetStar1(@ datetime)RETURNS varchar(100)ASBEGIN--仅⼀句 SQL 搞定--如果有静态的星座对照码表直接在查询中 join 效率相对更⾼RETURN(--declare @ datetime--set @ = getdate()select max(star)from(-- 星座,该星座开始⽇期所属⽉,该星座开始⽇期所属⽇select '魔羯座' as star,1 as [month],1 as [day]union all select '⽔瓶座',1,20union all select '双鱼座',2,19union all select '牧⽺座',3,21union all select '⾦⽜座',4,20union all select '双⼦座',5,21union all select '巨蟹座',6,22union all select '狮⼦座',7,23union all select '处⼥座',8,23union all select '天秤座',9,23union all select '天蝎座',10,24union all select '射⼿座',11,22union all select '魔羯座',12,22) starswhere dateadd(day,[day]-1,dateadd(month,[month]-1,dateadd(year,datediff(year,0,@),0)))=(select max(dateadd(day,[day]-1,dateadd(month,[month]-1,dateadd(year,datediff(year,0,@),0))))from(select '魔羯座' as star,1 as [month],1 as [day]union all select '⽔瓶座',1,20union all select '双鱼座',2,19union all select '牧⽺座',3,21union all select '⾦⽜座',4,20union all select '双⼦座',5,21union all select '巨蟹座',6,22union all select '狮⼦座',7,23union all select '处⼥座',8,23union all select '天秤座',9,23union all select '天蝎座',10,24union all select '射⼿座',11,22union all select '魔羯座',12,22) starswhere @ >= dateadd(day,[day]-1,dateadd(month,[month]-1,dateadd(year,datediff(year,0,@),0)))))endgodeclare @ datetimeset @ = getdate()select *from starswhere [month] * 40 + [day] =(select max(stars.[month] * 40 + stars.[day])from starswhere stars.[month] * 40 + stars.[day] <= month(@) * 40 + day(@))goselect c.birthdate,a.starfrom employees cleft join stars aon month(c.birthdate) * 40 + day(c.birthdate) >= a.month * 40 + a.dayleft join stars bon a.month * 40 + a.day < b.month * 40 + b.dayand b.month * 40 + b.day = (select min(month * 40 + day) from stars where month * 40 + day > a.month * 40 + a.day) where month(c.birthdate) * 40 + day(c.birthdate) < isnull(b.month * 40 + b.day,999)select *from stars aleft join stars bon a.month * 40 + a.day < b.month * 40 + b.dayand b.month * 40 + b.day = (select min(month * 40 + day) from stars where month * 40 + day > a.month * 40 + a.day) select a.birthdate,b.star,dbo.udf_getstar1(a.birthdate),dbo.udf_getstar(a.birthdate)from employees aleft join(select a.*,isnull(b.month,12) as m,isnull(b.day,31) as dfrom stars aleft join stars bon a.month * 40 + a.day < b.month * 40 + b.dayand b.month * 40 + b.day = (select min(month * 40 + day) from stars where month * 40 + day > a.month * 40 + a.day) ) bon month(a.birthdate) * 40 + day(a.birthdate) >= b.month * 40 + b.dayand month(a.birthdate) * 40 + day(a.birthdate) < b.m * 40 + b.dselect e.birthdate,a.starfrom employees eleft join stars aon month(e.birthdate) * 40 + day(e.birthdate) >= a.month * 40 + a.dayleft join stars bon a.month * 40 + a.day < b.month * 40 + b.dayand b.month * 40 + b.day = (select min(month * 40 + day) from stars where month * 40 + day > a.month * 40 + a.day) where month(e.birthdate) * 40 + day(e.birthdate) < isnull(b.month * 40 + b.day,999)go--测试use northwindselect dbo.getstar(birthdate),count(*)from employeesgroup by dbo.getstar(birthdate)create function Weekday(@Date datetime)returns integerbegin--1: Monday , ... ,7: Sundayreturn (select (@@datefirst + datepart(weekday,@Date)) % 7+ case when (@@datefirst + datepart(weekday,@Date)) % 7 < 2then 6else -1end)end。

实验八(上):SQL Server用户自定义函数和触发器

实验八(上)用户自定义函数和触发器一、实验目的1、掌握SQLServer中用户自定义函数的使用方法。

2、掌握SQL Server中触发器的使用方法。

二、实验内容和要求1.创建一个返回标量值的用户定义函数RectangleArea:输入矩形的长和宽就能计算矩形的面积。

自选2种实例调用该函数。

create function RectangleArea(@a int,@b int)returns intasbeginreturn @a*@benddeclare @area intexecute @area=RectangleArea 3,5print('矩形面积是:')print @areadeclare @area intexecute @area=RectangleArea 7,8print('矩形面积是:')print @area2.创建一个用户自定义函数(内嵌表值函数),功能为产生某个系的学生选修信息,内容为学号,姓名,课程名,成绩。

调用这个函数,显示信息系有选课学生的信息。

create function Search (@sdept char(10))returns tableasreturn(select sc.sno 学号,student.sname 姓名,ame 课程名,sc.grade 成绩,student.sdept 系别from sc,student,course where o=o andsc.sno = student.sno and sdept=@sdept)select*from Search('cs')3.创建一个作用在P表上的触发器P_checks,确保用户在插入或更新P表的WEIGHT值时,所提供的WEIGHT值介于20与40之间,否则给出错误提示并回滚此操作。

请测试该触发器,测试方法自定。

create trigger P_checks on p for insertasbegindeclare @weight intselect @weight=weight from insertedif @weight<10 or @weight>20beginRAISERROR('weight 必须在~20之间!',16,1)ROLLBACK TRANSACTIONendendinsert into p(pno,pname,color,weight)values('p7','刀片','红',40)insert into p(pno,pname,color,weight)values('p7','刀片','红',15)select*from p4.创建一个作用在J表上的触发器J_Update,禁止同时修改项目的名称和所在城市,并进行相应的错误提示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档