SQL表值函数和标量值函数的区别

简介:
     写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的,区别是表值函数只能返回一个表,标量值函数可以返回基类型。
     举个例子,当用户删除一个节点的时候,是需要将当前节点下的所有子节点都删掉,如果程序只传一个当前节点,那就需要写一个函数来得到当前节点下的所有子节点,这些子节点的信息就可以放到一个表中返回。
ALTER FUNCTION testGetSubNodes
(
 -- Add the parameters for the function here
 @nodeId int
)
RETURNS 
 @t TABLE 
(
 -- Add the column definitions for the TABLE variable here
 id bigint identity(1,1) not null, 
 nodeIds int ,
    nodeName varchar(500)
)
AS
BEGIN
 -- Fill the table variable with the rows for your result set
 insert into @t values(@nodeId,'header'); 
    while exists(
   select nodeid from dbo.Tree where parentid
        in (select nodeIds from @t) and nodeid not in(select nodeIds from @t))
    begin
      insert into @t select nodeid, nodename from dbo.Tree where parentid
        in (select nodeIds from @t)
    end
    
 RETURN 
END
 
这个函数的主要功能就是返回当前节点下的所有子节点,在存储过程中写
select * from testGetSubNodes(nodeId)就可以返回表中的数据了。
 
再写一个标量值函数
ALTER FUNCTION [dbo].[testGetSubNodes_]
(
 @nodeId int
)
RETURNS int
AS
BEGIN
    declare @nodeCount int
 select @nodeCount=5 from MenuTree
    return @nodeCount
END
这个函数很简单返回一个整型值,然后就可以在存储过程中调用了,不过调用的方式有所不同,象上面的表值函数调用是不需要所有者的,只要写函数名称就可以,对于标量值函数来说,是需要加上所有者的,比如所有者是dbo
select dbo.testGetSubNodes_,这样就可以返回5,如果不加dbo,那sql会不认识这个函数。


本文转自lidup 51CTO博客,原文链接:http://blog.51cto.com/lidup/160904,如需转载请自行联系原作者

   
目录
打赏
0
0
0
0
69
分享
相关文章
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
SQL中COUNT函数结合条件使用的技巧与方法
在SQL查询中,COUNT函数是一个非常常用的聚合函数,用于计算表中满足特定条件的记录数
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
SQL 中的大小写处理函数详解
【8月更文挑战第31天】
238 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等