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

写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的,区别是表值函数只能返回一个表,标量值函数可以返回基类型。举个例子,当用户删除一个节点的时候,是需要将当前节点下的所有子节点都删掉,如果程序只传一个当前节点,那就需要写一个函数来得到当前节点下的所有子节点,这些子节点的信息就可以放到一个表中返回。

ALTER FUNCTION testGetSubNodes
(
@nodeId int
)
RETURNS @t TABLE
(
id bigint identity(1,1) not null,
nodeIds int,
nodeName varchar(500)
)
AS
BEGIN
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

这个函数很简单返回一个整型值,然后就可以在存储过程中调用了,不过调用的方式有所不同,象上面的表值函数调用是不需要所有者的,只要写函数名称就可以,对于标量值函数来说,是需要加上所有者的,比如所有者是dboselect dbo.testGetSubNodes_,这样就可以返回5,如果不加dbo,那sql会不认识这个函数。

最新文章

  1. i春秋url地址编码问题
  2. PAT 乙级 1005. 继续(3n+1)猜想 (25)
  3. [前端 3]纯Js制作俄罗斯方块游戏
  4. 比较满意设计的一次作业 JDBC宠物管理
  5. WPF TextSelection获取选中部分内容
  6. linux 屏幕亮度调整命令
  7. React之组件通信
  8. 2017最新技术java高级架构、千万高并发、分布式集群、架构师入门到精通视频教程
  9. html标签分类
  10. Flask入门之flask-wtf表单处理
  11. pta寒假作业2
  12. 自顶向下深入分析Netty(五)--Future
  13. servlet 知识点 WebServlet("/")与WebServlet("/*")的区别
  14. python:浅拷贝与深拷贝
  15. [工具] 将Sublime Text 3配置为Java代码编辑器
  16. octomap的简介
  17. mac下能同时安装两个版本的xcode吗
  18. Codeforces 1155 D Beautiful Array DP,最大子段和
  19. 构建基于Chromium的应用程序(Winform程序加载Html页面)
  20. 红米NOTE应用闪退(包括系统设置等各种界面)问题解决经历

热门文章

  1. tomcat发布项目时,localhost可以访问,用ip地址不能访问,同时其他电脑也不能访问。
  2. Address already in use: JVM_Bind<null>:80
  3. Java基础-四要素之一《封装》
  4. 【Java线程】Callable和Future
  5. BIEE修改图片步骤:修改BANNER
  6. 关于ActionContext.getContext()的用法
  7. 淘宝业务常用english
  8. POJ1089 Intervals
  9. Linux Network IO Model、Socket IO Model - select、poll、epoll
  10. 基于redis分布式缓存实现