zoukankan      html  css  js  c++  java
  • SQL创建函数及应用

    用户自定义函数
    在SQL Server中,用户不仅可以使用标准的内置函数,也可以使用自己定义的函数来实现一些特殊的功能。用户自定义函数可以在企业管理器中创建,也可以使用CREATE FUNCTION 语句创建。在创建时需要注意:函数名在数据库中必须唯一,其可以有参数,也可以没有参数,其参数只能是输入参数,最多可以有1024参数。
    标量函数:返回单个数据值。
    表值函数:返回值是一个记录集合--表。在此函数中,return语
    句包含一条单独的select语句。
    多语句表值函数:返回值是由选择的结果构成的记录集。
    1、使用CREATE FUNCTION语句创建用户自定义函数
    在查询分析器中,可以使用CREATE FUNCTION创建用户自定义函数,其语法格式如下:
    CREATE FUNCTION [ owner_name.] function_name
    ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
    RETURNS scalar_return_data_type
    [ AS ]
    BEGIN
    function_body
    RETURN scalar_expression
    END

    function_name:指用户自定义函数的名称。其名称必须符合标识符的命名规则,并且对其所有者来说,该名称在数据库中必须唯一。
    @parameter_name:用户自定义函数的参数,其可以是一个或多个。每个函数的参数仅用于该函数本身;相同的参数名称可以用在其它函数中。参数只能代替常量;而不能用于代替表名、列名或其它数据库对象的名称。函数执行时每个已声明参数的值必须由用户指定,除非该参数的默认值已经定义。如果函数的参数有默认值,在调用该函数时必须指定"default"关键字才能获得默认值。
    scalar_parameter_data_type:参数的数据类型。
    scalar_return_data_type:是用户定义函数的返回值。可以是 SQL Server 支持的任何标量数据类型(text、ntext、image 和 timestamp 除外)。
    function_body:位于begin和end之间的一系列 Transact-SQL 语句,其只用于标量函数和多语句表值函数。
    scalar_expression:用户自定义函数中返回值的表达式。


    例:在STUDENT库中创建一个用户自定义函数XUEFEN,该函数通过输入成
    绩来判断是否取得学分,当成绩大于等于50时,返回取得学分,否则,
    返回未取得学分。其代码如下:
    CREATE FUNCTION xuefen(@inputxf int) RETURNS nvarchar(10)
    BEGIN
    declare @retrunstr nvarchar(10)
    If @inputxf >=50
    set @retrunstr='取得学分'
    else
    set @retrunstr='未取得学分'
    return @retrunstr
    END
    如果使用用户自定义函数,要在使用的时候指明函数的所有者和函数的名
    称。在查询分析器中输入如下代码:
    SELECT 学号,成绩,dbo.xuefen(成绩) AS 学分情况
    FROM 课程注册
    WHERE 课程号='0003'

    2、使用企业管理器创建用户定义函数
    在企业管理器中创建用户自定义函数的步骤为:
    1)在企业管理器中,选择需要建立函数的数据库,从中选择用户定义函数图标。
    2)选择用户定义函数图标后,击右健,从弹出的快捷菜单中选择“新建用户定义函数”命令,打开“用户定义函数属性”对话框,该属性窗口在“文本”框中列出了建立函数的框架,如图10.2所示。
    3)在“文本”框中输入函数的所有者、函数名称、参数列表、返回类型和函数体等函数的各个组成部分。
    4)单击“检查语法”按钮,检查输入的建立函数语句是否有语法错误。如果没有语法错误,单击“确定”按钮,将用户定义的函数保存到数据库中供用户以后使用。


    例:在STUDENT库中创建一个用户自定义函数XUEFENJI,该函数通过输入成绩来计算学生的学分绩。其代码如下:
    CREATE FUNCTION xuefenji(@inputzz int) RETURNS nvarchar(10)
    BEGIN
    declare @retrunstr nvarchar(10)
    if @inputzz >=50 AND @inputzz <60
    set @retrunstr='学分绩为0.8'
    else if @inputzz >=60 AND @inputzz <70
    set @retrunstr='学分绩为1.0'
    else if @inputzz >=70 AND @inputzz <80
    set @retrunstr='学分绩为1.2'
    else if @inputzz >=80 AND @inputzz <=100
    set @retrunstr='学分绩为1.5'
    else
    set @retrunstr='无学分绩'
    return @retrunstr
    END

    用户自定义函数的分类-标量函数
    例:
    USE STUDENT
    GO
    SELECT 课程号,成绩,dbo.xuefenji(成绩) AS 学分绩
    FROM 课程注册
    WHERE 学号='010101001001'
    GO
    需要查看“010101001001”号学生的课程学分绩


    用户自定义函数的分类-表值函数
    表值函数遵循的原则:
    1、RETURNS子句仅包含关键字table。不必定义返回变量的格式,因为它由RETURN 子句中的 SELECT 语句的结果集的格式设置。
    2、function_body 不由BEGIN和END分隔。
    3、RETURN子句在括号中包含单个SELECT语句。SELECT语句的结果集构成函数所返回的表。内嵌表值函数中使用的SELECT语句受到与视图中使用的SELECT语句相同的限制。

    例:在STUDENT库中创建一个内嵌表值函数XUESHENG,该函数可以根据输入的系部代码返回该系学生的基本信息。其代码如下:
    CREATE FUNCTION XUESHENG(@inputxbdm nvarchar(4)) RETURNS table
    AS
    RETURN
    ( SELECT 学号, 姓名, 入学时间 FROM 学生 WHERE 系部代码=@inputxbdm)
    GO
    建立好该内嵌表值函数后,就可以象使用表或视图一样来使用它:
    SELECT * FROM DBO.XUESHENG('01')
    GO


    用户自定义函数的分类-多表值函数
    例:在STUDENT库中创建一个多语句表值函数CHENGJI,该函数可以根据输入的课程名称返回选修该课程的学生姓名和成绩。其代码如下:
    CREATE FUNCTION CHENGJI( @inputkc as char(20) )
    RETURNS @chji TABLE
    (
    课程名 char(20),
    姓名 char(8),
    成绩 tinyint
    )
    AS
    BEGIN
    INSERT @chji
    SELECT c.课程名,s.姓名 ,k.成绩
    FROM 学生 as s INNER JOIN 课程注册 as k
    ON s.学号 =k.学号 inner join 课程 as c
    on c.课程号=k.课程号
    WHERE c.课程名=@inputkc
    RETURN
    END
    GO
    在查询分析器中输入以下查询命令:
    SELECT * FROM DBO.CHENGJIi('大学语文')


    用户自定义函数的分类-多表值函数
    总结:
    多语句函数的主体中允许使用以下语句。
    1、赋值语句。
    2、控制流语句。
    3、DECLARE 语句,该语句定义函数局部的数据变量和游标。
    4、SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
    5、游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以INTO子句向局部变量赋值的FETCH语句;不允许使用将数据返回到客户端的FETCH语句。
    6、INSERT、UPDATE和DELETE语句,这些语句修改函数的局部table变量。
    7、EXECUTE语句调用扩展存储过程。

  • 相关阅读:
    Filebeat Processors对日志数据的处理
    beats直接给es传输日志,自定义索引名
    Elasticsearch:修改fielddata
    Elasticsearch:Elasticsearch中的refresh和flush操作指南
    Elasticsearch创建索引(index)及一个文档(document)
    Elasticsearch:如何对PDF文件进行搜索
    C++ 类构造函数 & 析构函数~
    学习CSS的好地方:CSS Inspiration -- CSS灵感
    css式样里的content
    寄存器与cmp,mov,add,sub,IMUL指令
  • 原文地址:https://www.cnblogs.com/aliangblog/p/3162059.html
Copyright © 2011-2022 走看看