Home  >  Article  >  Database  >  掀开 SQL 表值函数神秘的面纱

掀开 SQL 表值函数神秘的面纱

WBOY
WBOYOriginal
2016-06-07 17:38:391332browse

我勒个去... 这标题如此粗鲁,谁起的? 改过来... 呵呵,管他呢!老师说不要在乎这些细节. 我们开始我们的话题,这里我们要讨论的是 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 编辑器中有出入)

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn