视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
掀开SQL表值函数神秘的面纱
2020-11-09 10:20:50 责编:小采
文档

我勒个去... 这标题如此粗鲁,谁起的? 改过来... 呵呵,管他呢!老师说不要在乎这些细节. 我们开始我们的话题,这里我们要讨论的是 SQL 中的表值函数. 对于熟悉他的同胞们可能本文没有多大的意义,但是对于刚入门的童鞋还是比较有用的. 笔者刚开始接触的时候也是

我勒个去... 这标题如此粗鲁,谁起的? 改过来... 呵呵,管他呢!老师说不要在乎这些细节.

我们开始我们的话题,这里我们要讨论的是 SQL 中的表值函数.

对于熟悉他的同胞们可能本文没有多大的意义,但是对于刚入门的童鞋还是比较有用的.

笔者刚开始接触的时候也是费了很大劲(可能本人比较笨!呵呵),在此以一个简单而又简明的例子来讨论这个看似神奇的东西.

所谓的表值函数,就是用户自定义的函数.

"表值" 表示它返回的值是一张表.

表值函数又分为内联表值函数和多语句表值函数(其实某个角度也是一样样儿的,别被弄糊涂了).

我们先看内联表值函数,下面我们就打开我们的 SQL 语句编辑工具,我们写第一个内联表值函数.

咱先不心慌,既然叫 "函数",那么他肯定具有函数的特征,猜猜... 如 括号,参数...

对! 它的语法并不难:

  CREATE FUNCTION 函数名 (参数,参数...) RETURNS TABLE
  AS
  RETURN
  (
    语句
  )
  GO

首先是 CREATE FUNCTION 表示创建函数,括号中是参数列表.

RETURNS TABLE 表示返回值是一个表.

AS 后面的 RETURN(语句) 就是函数执行的部分.

内联表值函数和多语句表值函数的区别其实就是内部的 SQL 查询语句的条数,以及写法稍有不同而已.

我们也来实干一下:

  CREATE FUNCTION MYFUN (@NUMBER1 INT,@NUMBER2 INT)

  RETURNS TABLE
  AS
  RETURN( select @NUMBER1+@NUMBER2 AS RESULT)

  --该函数做的事情很简单,就是把传入的两个值相加(当然这个例子严格说不是很好,因为你如果知道"标量值函数"且有不大区分得开,那就容易混淆了,但这里只是为了简洁)

声明了一个函数,参数为 @NUBMER1 和 @NUMBER2 两个 INT 类型的参数,标记返回值是 TABLE .

然后返回两个值相加的结果,由于这里返回的表列是 "匿名" 形式,所以必须对列起别名,这里叫 "RESULT".

调用函数:

  SELECT * FROM MYFUN(2,3)

  --当然返回的就是 5 了

看到这种调函数的方法,是不是你和小伙伴们都惊呆了? 开句玩笑.. 但这玩意是否有些出乎你的意料?

别急,想想,既然是表值函数,关键是返回的是 "婊",奥! 不对,是 "表" 那么我们在查询(调用函数就相当于在查询这张返回的表) 的时候是不是应该按照 SQL 中查表的方式呢?

对了,这不就想通了吗? 耶! 壮哉我大中华.. (貌似也扯不上半毛钱关系 呵呵)

和她零距离接触后,我们没了兴趣,那好,我们头脑风暴一下,看看下面这是啥...

(似乎这家伙看上去很厉害的样子... 她是干啥的? 会不会... 自己想去!)

  CREATE FUNCTION MYFUN(@NUMBER1 INT,@NUMBER2 INT)
  RETURNS @TAB TABLE(RESULT NVARCHAR(32))
  AS
  BEGIN
    INSERT INTO @TAB SELECT @NUMBER1+@NUMBER2
    UPDATE @TAB SET RESULT = RESULT * 10
    RETURN
  END
  GO

  --经过一场苦逼的头脑风暴,我们郁闷了,好的是聪明的你已经猜对了,它就是多语句表值函数

你可能会说,丫的,这里边的语句是多了,但是也没看出来它和内联表值函数有啥端倪丫...

前面也说过了,内联表值函数和多语句表值函数的不同就是在内部的SQL 语句数量.

上面的例子可以看出,我一条语句是填充 @TAB 表,另一个是更新它 RESULT 列的值,而这在内联表值函数的 RETURN(...) 括号中是不允许的,因为它的括号里只允许一条语句.

一条以上就会报错的.

值得一提的是,在多语句表值函数中,必须有"返回语句" 也就是 RETURN 标志,因为它不像内联表值函数那样早早就标明了 RETURN(语句) ,而是要手动的返回.

第二个注意的地方是,在多语句表值函数中,声明的返回表,在返回之前(RETURN) 必须有数据(哪怕是空),换句话说就是必须要把它进行初始化,否则就会报错"函数内包含的** 语句无法向客户端返回数据".

事就这么个事,现在我们猛然发现,其实表值函数也没什么难的,对吧?

本例子举例比较简单,当然你参透了之后,可以尽情的用它来做 "大事",不要吝啬! 呵呵

好的! 夜深了,至此,我们已经揭开了它的面纱,它已经裸露在你面前,你和你的小伙伴们都惊呆了...

呵呵 开句玩笑! 再见!

>>温馨提示: 代码本身很纯洁,没有错误,但是如果你 copy 到SQL 编辑器中报错的话,请尝试删除缩进的部分或者是重新替换掉它们(因为博客编辑器中的制表符貌似在 SQL 编辑器中有出入)

下载本文
显示全文
专题