东西越来越多!好好学才是硬道理!
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁用户自定义函数
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁自定义函数不能执行一系列改变数据库状态的操作,可以像系统函数在查询或存储过程等的程序中使用,也可以像相信过程一样能过execute命令来执行。自定义函数中存储了一个Transact
- SQL例程可以返回一定的值。根据函数返回值形式的不同,将用户看定义函数分为三种类型:
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁(
1 ).标量型函数:标量型函数返回一个确定类型的标量值,其返回值类型为除了text, ntext , image , cursor ,timestampt和table类型外的其它数据类型。函数体语句定义在begin - end语句内,其中包含了可以返回值的Transact - SQL命令。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁语法:
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
create   function   [ owner_name ]  function_name 
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁(
[ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] [ ,T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁n ] ])
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
returns  scalar_return_data_type
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
[ with <function_option> [,T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁n ] ]
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
[ as ]
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
begin
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁function_body
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
return   [ scalar_expression ]
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
end
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁其中:
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 1 > .function_option有两个可选值:{encryption | schemabinding}
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁encryption:加密选项,让SQL Server对系统表中有关create function的声明加密,以防止用户自定义函数作为SQL Server复制的一部分被发布。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁schemabinding,计划绑定选项。将用户自定义函数绑定到它所引用的数据库对象,则函数所涉及的的数据库对象从此将不能被删除或修改,除非函数被删除或去掉此选项。应注意的是要绑定的数据库对象必须与函数在同一数据库中。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 2 > .owner_name:指定用户自定义函数的所有者。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 3 > .function_name:指定用户自定义函数的名称。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 4 > .database_name.owner_name.function_name应是唯一的。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 5 > . @parameter_name :定义一个式多个参数的名称,一个函数最多可以定义1024个参数,每个参数前用 @符号标明 ,参数的作用范围是整个函数,参数只能替代常量,不能替代表名,列名或其它数据库对象名称,用户自定义函数不支持输出参数。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 6 > .scalar_parameter_data_type:指定标量参数的数据类型,除了text, ntext , image , cursor ,timestampt和table类型外的其它数据类型。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 7 > .scalar_return_data_type:指定标量返回值的数据类型,除了text, ntext , image , cursor ,timestampt和table类型外的其它数据类型。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 8 > .scalar_expression:指定标量型用户自定义函数返回的标量值表达式。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 9 > .function_body:指定一系列的Transact_SQL语句它们决定了函数的返回值。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁例:创建军工龄工资计算函数
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
use  taihang
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
go
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
-- 创建函数
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
create   function  workyearwage( @hiredate   datetime , @today   datetime , @per_wage   money )
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
-- hiredate表示雇佣期,today表示当前日期,par_wage表示每一年的工龄应得的工资额
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
returns   money
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
as   begin
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
declare   @workyearwage   money
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
set   @workyearwage = ( year ( @today ) - year ( @hiredate )) * @per_wage
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
return ( @workyearwage )
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
end -- 结束函数定义
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
go
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
-- 调用函数
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
select  taihang.dbo.workyearwage( &apos; 1999-7-1 &apos; , getdate (), 15 )
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
as  work_year_wage
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁注意:以上的函数体可简写为:
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
as   begin
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
return (( year ( @today ) - year ( @hiredate )) * @per_wage )
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
end
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁(
2 ).内嵌表值函数:以表的形式返回一个返回值,即它返回的是一个表。内嵌表值型函数没有由begin - end语句括起来的函数体,其返回的表由一个位于return子句中的select命令段从数据库中筛先出来。内嵌表值型函数功能相当于一个参数化的视图。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁创建函数语法:
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
create   function   [ owner_name ]  function_name 
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁(
[ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] [ ,T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁n ] ])
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
returns   table
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
[ with <function_option> [,T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁n ] ]
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
[ as ]
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
return  ( select - stmt)
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁其中:
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 1 > . table :批定返回值为一个表。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 2 > . select - stmt:单个select语句,确定返回的表的数据。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁例:创建返回所有订购某类产品的公司信息函数
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
use  taihang
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
go
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
create   function  orderfirms( @productid   varchar ( 30 ))
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
-- productid表示产品代号
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
returns   table
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
as
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
return ( select   *   from  products p 
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁       
where  p.p_id = @productid )
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
go
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁(
3 ).多语句表值型函数:可以看作标量型和内嵌表值型函数的结合体,它的返回值是一个表,但它和标量型函数一样有一个用begin - end语句括起来的函数体。返回值表中的数据是由函数体
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁语法:
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
create   function   [ owner_name ]  function_name 
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁(
[ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] [ ,T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁n ] ])
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
returns   @return_variable   table   < table_type_definition >
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
[ with <function_option> [,T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁n ] ]
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
[ as ]
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
begin
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁function_body
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
return   end
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁其中:
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 1 > . < table_type_definition > :({column_definition | table_constraint} [ ,T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁n ] )
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
< 2 > . @return_variable :一个table类型的变量,用于存储和累积返回的表中的数据行。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
4 .修改用户自定义函数
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
alter   function :此命令语法与create function相同,相当于重建。
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
5 .删除用户自定义函数
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁
drop   function { [ owner_name ] function_name}  [ ,T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁n ]
T-SQL学习笔记-程序设计基础-自定义函数  - 钱途无梁 - Notebook of 钱途无梁建议到企业管理器里修改,简单、方便。

========================================================================================

SQL Server 的三种自定义函数(用户定义的函数)

“自定义函数”是我们平常的说法,而“用户定义的函数”是 SQL Server 中书面的说法。

SQL Server 2000 允许用户创建自定义函数,自定义函数可以有返回值。

  • 如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数。可以使用多条 Transact-SQL 语句定义标量值函数。
  • 如果 RETURNS 子句指定 TABLE,则函数为表值函数。

  • 如果 RETURNS 子句指定的 TABLE 不附带列的列表,则该函数为内嵌表值函数。
  • 如果 RETURNS 子句指定的 TABLE 类型带有列及其数据类型,则该函数是多语句表值函数。

 


CREATE FUNCTION dbo.Foo()
RETURNS int
AS  
BEGIN 
    
declare @n int
    
select @n=3
    
return @n
END

CREATE FUNCTION dbo.Foo()
RETURNS TABLE
AS  
    
return select id, title from msgs

内嵌表值函数只有一个 select 语句。

 

CREATE FUNCTION fn_FindReports (@InEmpId nchar(5))
RETURNS @retFindReports TABLE (empid nchar(5primary key,
   empname 
nvarchar(50NOT NULL,
   mgrid 
nchar(5),
   title 
nvarchar(30))

注意其 RETURNS 部分。

多语句函数的主体中允许使用以下语句。未在下面的列表中列出的语句不能用在函数主体中。

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

 

posted on 2009-05-31 11:27  钱途无梁  阅读(932)  评论(0编辑  收藏  举报