slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
开发函数 PowerPoint Presentation
Download Presentation
开发函数

Loading in 2 Seconds...

  share
play fullscreen
1 / 20
nola-butler

开发函数 - PowerPoint PPT Presentation

61 Views
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. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - - 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 函数名 函数定义