1 / 20

开发函数

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

nola-butler
Download Presentation

开发函数

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 开发函数

  2. 函数的优点和缺点 • 优点 • 类似于视图,可以将它们用在表达式或者select语句的from子句中。 • 比视图更灵活,可以接收参数 • 具有存储过程的优点,函数也是预先经过编译和优化的。 • 缺点 • 不易移植

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

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

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

  6. 标量函数 CREATE FUNCTION FunctionName (InputParameters) RETURNS DataType AS BEGIN Code RETURN Expression END

  7. 标量函数例子 CREATE FUNCTION dbo.fMultiply (@A INT, @B INT = 3) RETURNS INT AS BEGIN RETURN @A * @B End

  8. 调用标量函数 • 在表达式中任何可以使用单个值的地方都可以使用标量函数。 • 调用标量函数时,必须始终使用由两个部分构成的名字(owner.name)。 SELECT dbo.fMultiply (3,4) SELECT dbo.fMultiply (7, DEFAULT)

  9. 标量函数例子 CREATE FUNCTION dbo.fGradeLevel (@Grade INT = 0) RETURNS NCHAR(3) AS BEGIN IF @Grade < 60 RETURN '不及格' IF @Grade >= 60 AND @Grade < 70 RETURN '及格' IF @Grade >= 70 AND @Grade < 80 RETURN '中' IF @Grade >= 80 AND @Grade < 90 RETURN '良好' IF @Grade >= 90 RETURN '优秀' RETURN '错误' End

  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

  11. 内嵌表函数 CREATE FUNCTION FunctionName (InputParameters) RETURNS Table AS RETURN (Select Statement)

  12. 内嵌表函数优点 • 内嵌表函数非常类似于视图,它们都包含有一条存储的select语句。 • 内嵌表函数不仅具有视图的全部优点,而且还多了视图所没有的两个新优点:预先编译和可以使用参数。如同视图一样,如果所包含的select语句是可以更新的,内嵌表值函数就是可以更新的。

  13. 内嵌表函数例子 CREATE FUNCTION fStudent_GradeLevel (@cname nchar(10)) RETURNS Table AS RETURN(SELECT student.sno, sname, cname, dbo.GradeLevel (grade) AS GradeLevel FROM STUDENT JOIN SC ON student.sno=sc.sno JOIN COURSE ON sc.cno=course.cno WHERE cname=@cname OR @cname IS NULL)

  14. 使用内嵌表函数 SELECT GradeLevel, Count(*) FROM dbo.fStudent_GradeLevel('数学') GROUP BY GradeLevel SELECT GradeLevel, Count(*) FROM dbo.fStudent_GradeLevel(NULL) GROUP BY GradeLevel

  15. 多语句表函数 • 多语句表值用户定义函数既可以像标量函数那样包含复杂的代码,也可以像内嵌表值函数那样返回一个结果集。这类函数会创建一个表变量,并使用代码对它进行填充。然后,它会将这个表变量返回,以便在select语句中使用它。 • 多语句表值用户定义函数的主要优点是:可以用代码产生复杂的结果集,然后方便地在select语句中使用它。因此,可以使用这些函数来替代返回结果集的存储过程。 。

  16. 多语句表函数 CREATE FUNCTION FunctionName (InputParamenters) RETURNS @TableName TABLE (Columns) AS BEGIN Code to populate table variable RETURN END

  17. 多语句表函数 CREATE FUNCTION fElectiveList() RETURNS @ElectiveList TABLE (cname NCHAR(10), list NCHAR(128)) AS BEGIN DECLARE @old_cname NCHAR(10), @new_cname NCHAR(10), @sname NCHAR(3), @list NVARCHAR(128) DECLARE cList CURSOR FOR SELECT cname, sname FROM student JOIN sc ON student.sno = sc.sno JOIN course ON sc.cno = course.cno ORDER BY cname OPEN cList

  18. 多语句表函数 SET @list = '' FETCH cList INTO @old_cname, @sname WHILE @@Fetch_Status = 0 BEGIN SET @list = @list+@sname FETCH cList INTO @new_cname, @sname IF @new_cname <> @old_cname OR @@Fetch_Status <> 0 BEGIN INSERT INTO @ElectiveList (cname, list) VALUES (@old_cname, @list) SET @old_cname = @new_cname SET @list = '' END END CLOSE cList DEALLOCATE cList RETURN END

  19. 调用多语句表函数 • SELECT * FROM dbo.fElectiveList()

  20. 删除和修改函数 • DROP FUNCTION 函数名 • ALTER FUNCTION 函数名 函数定义

More Related