开发函数

20
开开开开

description

开发函数. 函数的优点和缺点. 优点 类似于视图,可以将它们用在表达式或者 select 语句的 from 子句中。 比视图更灵活,可以接收参数 具有存储过程的优点,函数也是预先经过编译和优化的。 缺点 不易移植. 函数的种类. 返回单值的标量函数 类似于视图的可更新内嵌表函数 使用代码创建结果集的多语句表函数. 标量函数. 标量函数是返回单个值的函数。这类函数可以接收多个参数,进行计算,然后返回单个值。可以在 SQL Server 的表达式(包括 check 约束中的表达式)中使用这些用户定义函数,而这些函数将会使用 return 命令来返回一个值。. - PowerPoint PPT Presentation

Transcript of 开发函数

Page 1: 开发函数

开发函数

Page 2: 开发函数

函数的优点和缺点

优点 类似于视图,可以将它们用在表达式或者

select 语句的 from 子句中。 比视图更灵活,可以接收参数 具有存储过程的优点,函数也是预先经过

编译和优化的。 缺点

不易移植

Page 3: 开发函数

函数的种类 返回单值的标量函数 类似于视图的可更新内嵌表函数 使用代码创建结果集的多语句表函数

Page 4: 开发函数

标量函数

标量函数是返回单个值的函数。这类函数可以接收多个参数,进行计算,然后返回单个值。可以在 SQL Server 的表达式(包括 check 约束中的表达式)中使用这些用户定义函数,而这些函数将会使用 return 命令来返回一个值。

Page 5: 开发函数

标量函数

与定义存储过程的参数类似,定义用户函数的输入参数时需要给出数据类型定义,如果有必要,还可以为其提供默认值。但与存储过程不同的是,即使为函数的参数指定了默认值,在调用函数时仍然需要为它提供相应的参数值。也就是说,具有默认值的参数也不是可选参数。如果要使用参数的默认值调用函数,可以在调用时将关键字 default 传递给函数。

Page 6: 开发函数

标量函数

CREATE FUNCTION FunctionName (InputParameters)

RETURNS DataType

AS

BEGIN

Code

RETURN Expression

END

Page 7: 开发函数

标量函数例子

CREATE FUNCTION dbo.fMultiply (@A INT, @B INT = 3)

RETURNS INT

AS

BEGIN

RETURN @A * @B

End

Page 8: 开发函数

调用标量函数

在表达式中任何可以使用单个值的地方都可以使用标量函数。

调用标量函数时,必须始终使用由两个部分构成的名字( owner.name )。

SELECT dbo.fMultiply (3,4)

SELECT dbo.fMultiply (7, DEFAULT)

Page 9: 开发函数

标量函数例子CREATE FUNCTION dbo.fGradeLevel (@Grade INT = 0)RETURNS NCHAR(3)ASBEGIN

IF @Grade < 60RETURN ' 不及格 '

IF @Grade >= 60 AND @Grade < 70RETURN ' 及格 '

IF @Grade >= 70 AND @Grade < 80RETURN ' 中 '

IF @Grade >= 80 AND @Grade < 90RETURN ' 良好 '

IF @Grade >= 90RETURN ' 优秀 '

RETURN ' 错误 'End

Page 10: 开发函数

调用标量函数 dbo.GradeLevel

SELECT student.sno, sname, cname,

dbo.fGradeLevel (grade)

FROM STUDENT

JOIN SC

ON student.sno=sc.sno

JOIN COURSE

ON sc.cno=course.cno

Page 11: 开发函数

内嵌表函数

CREATE FUNCTION FunctionName (InputParameters)

RETURNS Table

AS

RETURN (Select Statement)

Page 12: 开发函数

内嵌表函数优点

内嵌表函数非常类似于视图,它们都包含有一条存储的 select 语句。

内嵌表函数不仅具有视图的全部优点,而且还多了视图所没有的两个新优点:预先编译和可以使用参数。如同视图一样,如果所包含的 select 语句是可以更新的,内嵌表值函数就是可以更新的。

Page 13: 开发函数

内嵌表函数例子CREATE FUNCTION fStudent_GradeLevel (@cname

nchar(10))RETURNS TableASRETURN(SELECT student.sno, sname, cname, dbo.G

radeLevel (grade) AS GradeLevelFROM STUDENT

JOIN SCON student.sno=sc.sno

JOIN COURSEON sc.cno=course.cno

WHERE cname=@cname OR @cname IS NULL)

Page 14: 开发函数

使用内嵌表函数

SELECT GradeLevel, Count(*)

FROM dbo.fStudent_GradeLevel(' 数学 ')

GROUP BY GradeLevel

SELECT GradeLevel, Count(*)

FROM dbo.fStudent_GradeLevel(NULL)

GROUP BY GradeLevel

Page 15: 开发函数

多语句表函数 多语句表值用户定义函数既可以像标量函数

那样包含复杂的代码,也可以像内嵌表值函数那样返回一个结果集。这类函数会创建一个表变量,并使用代码对它进行填充。然后,它会将这个表变量返回,以便在 select 语句中使用它。

多语句表值用户定义函数的主要优点是:可以用代码产生复杂的结果集,然后方便地在 select 语句中使用它。因此,可以使用这些函数来替代返回结果集的存储过程。 。

Page 16: 开发函数

多语句表函数

CREATE FUNCTION FunctionName (InputParamenters)

RETURNS @TableName TABLE (Columns)

AS

BEGIN

Code to populate table variable

RETURN

END

Page 17: 开发函数

多语句表函数CREATE FUNCTION fElectiveList()RETURNS @ElectiveList TABLE

(cname NCHAR(10),list NCHAR(128))

ASBEGIN

DECLARE @old_cname NCHAR(10),@new_cname NCHAR(10),@sname NCHAR(3),@list NVARCHAR(128)

DECLARE cList CURSORFOR SELECT cname, sname

FROM studentJOIN sc ON student.sno = sc.snoJOIN course ON sc.cno = course.cno

ORDER BY cnameOPEN cList

Page 18: 开发函数

多语句表函数SET @list = ''FETCH cList INTO @old_cname, @snameWHILE @@Fetch_Status = 0

BEGINSET @list = @list+@snameFETCH cList INTO @new_cname, @snameIF @new_cname <> @old_cname OR @@Fetch_Status <> 0BEGIN

INSERT INTO @ElectiveList (cname, list)VALUES (@old_cname, @list)

SET @old_cname = @new_cnameSET @list = ''

ENDEND

CLOSE cListDEALLOCATE cList

RETURNEND

Page 19: 开发函数

调用多语句表函数

SELECT * FROM dbo.fElectiveList()

Page 20: 开发函数

删除和修改函数

DROP FUNCTION 函数名 ALTER FUNCTION 函数名

函数定义