Rumah  >  Artikel  >  pangkalan data  >  掀开 SQL 表值函数神秘的面纱

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

WBOY
WBOYasal
2016-06-07 17:38:391332semak imbas

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

 

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn