zoukankan      html  css  js  c++  java
  • Sqlserver 自定义函数

    用户自定义函数
    自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数 在查询或存储过程等的程序中使用,也可以像相信过程一样能过execute命令来执行。自定义函数中存储了一个Transact - SQL例程可以返回一定的值。根据函数返回值形式的不同,将用户看定义函数分为三种类型:
    ( 1 ).标量型函数:标量型函数返回一个确定类型的标量值,其返回值类型为除了text, ntext , image , cursor ,timestampt和table类型外的其它数据类型。函数体语句定义在begin - end语句内,其中包含了可以返回值的Transact - SQL命令。
    语法:
     create   function   [ owner_name ]  function_name
    ( [ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] }  [ ,n ] ])
     returns  scalar_return_data_type
     [ with <function_option> [,n ] ]
     [ as ]
     begin
    function_body
     return   [ scalar_expression ]
     end
    其中:
     < 1 > .function_option有两个可选值:{encryption | schemabinding}
    encryption:加密选项,让SQL Server对系统表中有关create function的声明加密,以防止用户自定义函数作为SQL Server复制的一部分被发布。
    schemabinding,计划绑定选项。将用户自定义函数绑定到它所引用的数据库对象,则函数所涉及的的数据库对象从此将不能被删除或修改,除非函数被删除或去掉此选项。应注意的是要绑定的数据库对象必须与函数在同一数据库中。
     < 2 > .owner_name:指定用户自定义函数的所有者。
     < 3 > .function_name:指定用户自定义函数的名称。
     < 4 > .database_name.owner_name.function_name应是唯一的。
     < 5 > . @parameter_name :定义一个式多个参数的名称,一个函数最多可以定义1024个参数,每个参数前用 @符号标明 ,参数的作用范围是整个函数,参数只能替代常量,不能替代表名,列名或其它数据库对象名称,用户自定义函数不支持输出参数。
     < 6 > .scalar_parameter_data_type:指定标量参数的数据类型,除了text, ntext , image , cursor ,timestampt和table类型外的其它数据类型。
     < 7 > .scalar_return_data_type:指定标量返回值的数据类型,除了text, ntext , image , cursor ,timestampt和table类型外的其它数据类型。
     < 8 > .scalar_expression:指定标量型用户自定义函数返回的标量值表达式。
     < 9 > .function_body:指定一系列的Transact_SQL语句它们决定了函数的返回值。

    例:创建军工龄工资计算函数
     use  taihang
     go
     -- 创建函数
     create   function  workyearwage( @hiredate   datetime , @today   datetime , @per_wage   money )
     -- hiredate表示雇佣期,today表示当前日期,par_wage表示每一年的工龄应得的工资额
     returns   money
     as   begin
     declare   @workyearwage   money
     set   @workyearwage = ( year ( @today ) - year ( @hiredate )) * @per_wage
     return ( @workyearwage )
     end -- 结束函数定义
     go
     -- 调用函数
     select  taihang.dbo.workyearwage( ' 1999-7-1 ' , getdate (), 15 )
     as  work_year_wage
    注意:以上的函数体可简写为:
     as   begin
     return (( year ( @today ) - year ( @hiredate )) * @per_wage )
     end
     
    ( 2 ).内嵌表值函数:以表的形式返回一个返回值,即它返回的是一个表。内嵌表值型函数没有由begin - end语句括起来的函数体,其返回的表由一个位于return子句中的select命令段从数据库中筛先出来。内嵌表值型函数功能相当于一个参数化的视图。
    创建函数语法:
     create   function   [ owner_name ]  function_name
    ( [ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] }  [ ,n ] ])
     returns   table
     [ with <function_option> [,n ] ]
     [ as ]
     return  ( select - stmt)
    其中:
     < 1 > . table :批定返回值为一个表。
     < 2 > . select - stmt:单个select语句,确定返回的表的数据。
    例:创建返回所有订购某类产品的公司信息函数
     use  taihang
     go
     create   function  orderfirms( @productid   varchar ( 30 ))
     -- productid表示产品代号
     returns   table
     as
     return ( select   *   from  products p
            where  p.p_id = @productid )
     go
     
    ( 3 ).多语句表值型函数:可以看作标量型和内嵌表值型函数的结合体,它的返回值是一个表,但它和标量型函数一样有一个用begin - end语句括起来的函数体。返回值表中的数据是由函数体
    语法:
     create   function   [ owner_name ]  function_name
    ( [ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] }  [ ,n ] ])
     returns   @return_variable   table   < table_type_definition >
     [ with <function_option> [,n ] ]
     [ as ]
     begin
    function_body
     return   end
    其中:
     < 1 > . < table_type_definition > :({column_definition | table_constraint} [ ,n ] )
     < 2 > . @return_variable :一个table类型的变量,用于存储和累积返回的表中的数据行。

     4 .修改用户自定义函数
     alter   function :此命令语法与create function相同,相当于重建。
     5 .删除用户自定义函数
     drop   function { [ owner_name ] function_name}  [ ,n ]


    测试:


    --自定义函数


    --(1)标量型函数
    --use test
    --go
    --create function fun1(@id int)
    --returns  varchar(500)
    --as begin
    --declare @ret varchar(500)
    -- set @ret=(select WebSite from PageInfo where Id=@id)
    -- return @ret
    --end

    --use test
    --go
    --select  test.dbo.fun1(85) as '网址'


    --(2)内嵌表值函数   没有begin end

    --use test
    --go
    --create function fun2()
    --returns table
    --as
    -- return (select WebSite,BaiduIncluded,GoogleIncluded from PageInfo)
     
    --select * from test.dbo.fun2()

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    129. Sum Root to Leaf Numbers
    117. Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/8090sns/p/2845352.html
Copyright © 2011-2022 走看看