sql server

sql server 自定义函数

2020-04-01  本文已影响0人  z_strive

自定义函数(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

上一篇 下一篇

猜你喜欢

热点阅读