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()

  • 相关阅读:
    ec20 queclocator V1. 0 test
    javascript JSON.parse and JSON.stringify
    linux command pushd popd
    learning gcc #pragma once
    learning gcc __BEGIN_DECLS and __END_DECLS
    aarch-linux-gnu-g++ install
    启用”开始“菜单中的“运行”功能
    获取本机安装的软件清单
    固定任务栏
    优化菜单显示速度
  • 原文地址:https://www.cnblogs.com/8090sns/p/2845352.html
Copyright © 2011-2022 走看看