Maison >base de données >tutoriel mysql > 掀开 SQL 表值函数神秘的面纱
我勒个去... 这标题如此粗鲁,谁起的? 改过来... 呵呵,管他呢!老师说不要在乎这些细节. 我们开始我们的话题,这里我们要讨论的是 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 编辑器中有出入)
,