用户自定义函数

用户自定义函数,第1张

概述语法格式   CREATE FUNCTION <函数名称>                (                 -- 函数的参数(可以多个)                 <@param1, sysname, @p1> <data_type_for_param1, , int>,                 <@param2, sysname, @p2> <data_type_

语法格式

  CREATE FUNCTION <函数名称>
               (
                -- 函数的参数(可以多个)
                <@param1,sysname,@p1> <data_type_for_param1,int>,
                <@param2,@p2> <data_type_for_param2,char>
               )
              RETURNS
              <@表变量名>  table
              (
               -- 返回的虚拟表中的字段  字段名 类型
               <Column_1,c1> <Data_Type_For_Column1,
               <Column_2,c2> <Data_Type_For_Column2,int>
              )
              AS
              BEGIN
                    -- 函数体,里面可以定义一些变量,总之最后返回的应该是个结果集
              RETURN
              END

              GO

编写实例
CREATE function IncNum(@num varchar(100))returns nvarchar(20)as--将指定串递增--参数:@num 编号begindeclare @s nvarchar(20),@s1 nvarchar(20),@left nvarchar(20),@right nvarchar(20),@nextnum nvarchar(50)set @s=@numset @nextnum=''set @s1=''set @left=''set @right=''while len(@s)>0begin set @s1=substring(@s,1,1)if @s1 like '[0123456789'   set @right=@right+@s1else   set @right=''set @s=stuff(@s,'') endif @right=''return ''set @right=cast(cast(@right as int)+1 as nvarchar(20))set @left=left(@num,len(@num)-len(@right))set @nextnum=@left+@rightreturn @nextnumend


调用方法

使用: select dbo.IncNum('A001S1')

结果: A001S2

 

返回表

 

第一种方式

直接返回:

CREATE FUNCTION dbo.GetReportData (@Date1 varchar(10),@Date2 varchar(10))  RETURNS table AS  RETURNSELECT top 100 PERCENT * FROM t_r_d_ProductReport WHERE m_Date >= @Date1 AND m_Date <= @Date2ORDER BY m_Sequence



优点:简单明了,无中间变量。
缺点:不能在返回过程中添加其它程序片段。


第二种方式

创建table类型的变量,向其中插入数据,然后返回:


CREATE FUNCTION dbo.DayProductReportSum (@Date varchar(10))  RETURNS @table table  ( m_PlanedSum int,m_ActualSum int,m_ExcessSum int,m_Sequence tinyint)ASBEGINDECLARE @firstDay varchar(10)SET @firstDay =   dbo.GetFirstDayOfTenDays(@Date)INSERT @tableSELECT SUM(m_PlanedOutput),SUM(m_ActualOutput),SUM(m_ActualOutput) - SUM(m_PlanedOutput),m_SequenceFROM dbo.GetReportData(@firstDay,@Date)GROUP BY m_SequenceRETURNEND

优点:可以添加其它程序片段,比如定义新的变量等。
缺点:有中间变量,稍复杂。



if判断

--创建用户自定义函数/****** 对象:  UserdefinedFunction [dbo].[Membername]    脚本日期: 08/03/2009 11:18:15 ******/SET ANSI_NulLS ONGOSET QUOTED_IDENTIFIER ONGOcreate function [dbo].[Membername](@member_ID varchar(32),@member_type char(1))returns varchar(300)as  begin  Declare @membername varchar(300)  if @member_type='R'          begin          set @membername=(select name_ from wf_org_role where ID_=@member_ID)          end  else if  @member_type='G'          begin          set @membername=(select name_ from wf_org_group where ID_=@member_ID)          end  else if  @member_type= 'D'          begin          set @membername=(select name_ from wf_org_department where ID_=@member_ID)          end  else if  @member_type= 'U'          begin          set @membername=(select displayname_ from wf_org_user where ID_=@member_ID)          end  return @membername  end


  --调用查询语句例子
  select dbo.Membername(member_ID,member_type),workflow_ID,member_ID,kNowledge_code from tb_wf_privgrant

注意:

如果你这样来调用:
      select Membername(member_ID,kNowledge_code from tb_wf_privgrant 

可能会报:
 消息 195,级别 15,状态 10,第 1 行
'Membername' 不是可以识别的 内置函数名称。

解决方案:

自定义函数前加上所有者,如:dbo.

总结

以上是内存溢出为你收集整理的用户自定义函数全部内容,希望文章能够帮你解决用户自定义函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1175318.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存