200 likes | 296 Views
开发函数. 函数的优点和缺点. 优点 类似于视图,可以将它们用在表达式或者 select 语句的 from 子句中。 比视图更灵活,可以接收参数 具有存储过程的优点,函数也是预先经过编译和优化的。 缺点 不易移植. 函数的种类. 返回单值的标量函数 类似于视图的可更新内嵌表函数 使用代码创建结果集的多语句表函数. 标量函数. 标量函数是返回单个值的函数。这类函数可以接收多个参数,进行计算,然后返回单个值。可以在 SQL Server 的表达式(包括 check 约束中的表达式)中使用这些用户定义函数,而这些函数将会使用 return 命令来返回一个值。.
E N D
函数的优点和缺点 • 优点 • 类似于视图,可以将它们用在表达式或者select语句的from子句中。 • 比视图更灵活,可以接收参数 • 具有存储过程的优点,函数也是预先经过编译和优化的。 • 缺点 • 不易移植
函数的种类 • 返回单值的标量函数 • 类似于视图的可更新内嵌表函数 • 使用代码创建结果集的多语句表函数
标量函数 • 标量函数是返回单个值的函数。这类函数可以接收多个参数,进行计算,然后返回单个值。可以在SQL Server的表达式(包括check约束中的表达式)中使用这些用户定义函数,而这些函数将会使用return命令来返回一个值。
标量函数 • 与定义存储过程的参数类似,定义用户函数的输入参数时需要给出数据类型定义,如果有必要,还可以为其提供默认值。但与存储过程不同的是,即使为函数的参数指定了默认值,在调用函数时仍然需要为它提供相应的参数值。也就是说,具有默认值的参数也不是可选参数。如果要使用参数的默认值调用函数,可以在调用时将关键字default传递给函数。
标量函数 CREATE FUNCTION FunctionName (InputParameters) RETURNS DataType AS BEGIN Code RETURN Expression END
标量函数例子 CREATE FUNCTION dbo.fMultiply (@A INT, @B INT = 3) RETURNS INT AS BEGIN RETURN @A * @B End
调用标量函数 • 在表达式中任何可以使用单个值的地方都可以使用标量函数。 • 调用标量函数时,必须始终使用由两个部分构成的名字(owner.name)。 SELECT dbo.fMultiply (3,4) SELECT dbo.fMultiply (7, DEFAULT)
标量函数例子 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
调用标量函数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
内嵌表函数 CREATE FUNCTION FunctionName (InputParameters) RETURNS Table AS RETURN (Select Statement)
内嵌表函数优点 • 内嵌表函数非常类似于视图,它们都包含有一条存储的select语句。 • 内嵌表函数不仅具有视图的全部优点,而且还多了视图所没有的两个新优点:预先编译和可以使用参数。如同视图一样,如果所包含的select语句是可以更新的,内嵌表值函数就是可以更新的。
内嵌表函数例子 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)
使用内嵌表函数 SELECT GradeLevel, Count(*) FROM dbo.fStudent_GradeLevel('数学') GROUP BY GradeLevel SELECT GradeLevel, Count(*) FROM dbo.fStudent_GradeLevel(NULL) GROUP BY GradeLevel
多语句表函数 • 多语句表值用户定义函数既可以像标量函数那样包含复杂的代码,也可以像内嵌表值函数那样返回一个结果集。这类函数会创建一个表变量,并使用代码对它进行填充。然后,它会将这个表变量返回,以便在select语句中使用它。 • 多语句表值用户定义函数的主要优点是:可以用代码产生复杂的结果集,然后方便地在select语句中使用它。因此,可以使用这些函数来替代返回结果集的存储过程。 。
多语句表函数 CREATE FUNCTION FunctionName (InputParamenters) RETURNS @TableName TABLE (Columns) AS BEGIN Code to populate table variable RETURN END
多语句表函数 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
多语句表函数 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
调用多语句表函数 • SELECT * FROM dbo.fElectiveList()
删除和修改函数 • DROP FUNCTION 函数名 • ALTER FUNCTION 函数名 函数定义