sql server 自定义函数

自定义函数(User-Defined Function)有两种,一种是标量UDF(Scalar-valued Functions)和表值UDF(Table-valued

Functions),前者只返回单个数据值,而后者则返回一个表


CREATE FUNCTIONfunction_name(@parameter_name parameter_data_type)

RETURNS date_type   --返回返回值的数据类型

[WITH ENCRYPTION]  --如果指定了encryption 则函数被加密

[AS]

BEGIN

 function_body --函数体(即 Transact-SQL 语句)

 RETURN  表达式;

END


在编写自定义函数时需要注意的:

标量函数:

1.      所有的入参前都必须加@

2.      create后的返回,单词是returns,而不是return

3.      returns后面的跟的不是变量,而是返回值的类型,如:int,char等。

4.      在begin/end语句块中,是return。

内联表格值函数:

1.      只能返回table,所以returns后面一定是TABLE

2.      AS后没有begin/end,只有一个return语句来返回特定的记录。

多语句表值函数:

1.      returns后面直接定义返回的表类型,首先是定义表名,表明前面要加@,然后是关键字TABLE,最后是表的结构。

2.      在begin/end语句块中,直接将需要返回的结果insert到returns定义的表中就可以了,在最后return时,会将结果返回。

3.      最后只需要return,return后面不跟任何变量。




例子:

ALTER function [dbo].[splitDt]

(

@SourceSqlvarchar(max),--传入参数

@StrSepratevarchar(6),

@BHvarchar(20)

)

returns @temp table(MCH varchar(100),BH varchar(20))---@ 表示局部变量。Returns返回值

as

begin

    declare@i int

    set@SourceSql = rtrim(ltrim(@SourceSql))--去除左右空格

    set@i = charindex(@StrSeprate,@SourceSql)--查找,数

    while@i >= 1---有逗号

    begin

        if len(left(@SourceSql,@i-1))>0--返回字符表达式中的字符数,值大于1个

        begin

            insert @temp values(left(@SourceSql,@i-1),@BH)

        end

        set @SourceSql=substring(@SourceSql,@i+len(@StrSeprate),len(@SourceSql)-@i)

        set @i=charindex(@StrSeprate,@SourceSql)

    end

    if@SourceSql <> ''---值是一个,没有逗号

        insert @temp values(@SourceSql,@BH)

    return

end



使用:

select mch,bh FROM splitDt(RTRIM('医疗器械第一类,中成药,化妆品,消毒品,其他,化学药制剂'),',','550640')

结果:




1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。