SQL表值函数和标量值函数的区别 [转]

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会不认识这个函数。

 

以下是本人写的例子

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  <yuzt>
-- Create date: <2010-01-20 2:27 >
-- Type: 多语句表值函数
-- Description: <判断多次回录的时间是否在结算周期内.在周期内可以回录返回0,否则返回1>
-- 调用方法:SELECT * FROM dbo.ReadytestFunc('2010-2-28',1,107)
--SELECT * FROM dbo.F_IsOverFeedBackTime('2009-2-28',1,107)
-- =============================================
ALTER FUNCTION dbo.F_IsOverFeedBackTime
(
 @applyorderTime DATETIME ,
 @RegionID INT ,
 @ModuleID INT
)

RETURNS @table TABLE (bsettle DATETIME,esettle DATETIME,returnval INT)

AS
BEGIN
 -- Fill the table variable with the rows for your result set
 DECLARE @Ayear INT  --订单提交时间年
 DECLARE @Amonth INT  --订单提交时间月
 DECLARE @Aday INT  --订单提交时间日
 
 DECLARE @BEGINday INT --结算开始日
 DECLARE @ENDday INT     --结算截止日
 
 DECLARE @BsettlementTime DATETIME;     ----结算周期开始时间
 DECLARE @EsettlementTime DATETIME;    ----结算周期结束时间
 
 DECLARE @NextYear INT                 ----下一年
 DECLARE @PreYear INT      ----上一年
 DECLARE @NextMonth INT      ----下一月
 DECLARE @PreMonth INT      ----上一月
 
 DECLARE @returnval INT     --返回值
 
 SET @Ayear = YEAR(@applyorderTime)
 SET @Amonth = MONTH(@applyorderTime)
 SET @Aday = DAY(@applyorderTime)
 
 SELECT @BEGINday = BeginDate ,@ENDday = ENDDate FROM Config_BillingCycle WHERE ModuleID=@ModuleID AND RegionID=@RegionID AND isvalid=1
  IF(@Aday<=@BEGINday  AND @Aday<=@BEGINday )  --上月和本月(都小于)
  BEGIN
   SET @PreMonth =@Amonth-1
   IF(@PreMonth<=0)---1月份的情况
   BEGIN
    SET @PreYear = @Ayear -1
    SET @BsettlementTime = CONVERT(VARCHAR(4),@PreYear)+'-12'+'-'+CONVERT(VARCHAR(4),@BEGINday)
    SET @EsettlementTime = CONVERT(VARCHAR(4),@Ayear)+'-01'+'-'+CONVERT(VARCHAR(4),@ENDday) 
   END
   ELSE
   BEGIN
    SET @BsettlementTime = CONVERT(VARCHAR(4),@Ayear)+'-'+CONVERT(VARCHAR(4),@PreMonth)+'-'+CONVERT(VARCHAR(4),@BEGINday)
    SET @EsettlementTime = CONVERT(VARCHAR(4),@Ayear)+'-'+CONVERT(VARCHAR(4),@Amonth)+'-'+CONVERT(VARCHAR(4),@ENDday)
   END
  END
  IF(@Aday>=@BEGINday  AND @Aday>=@BEGINday )  --本月和下月(大于)
  BEGIN
   SET @NextMonth =@Amonth+1
   IF(@NextMonth >=13)----12月份的情况
   BEGIN
    SET @NextYear = @Ayear +1
    SET @BsettlementTime = CONVERT(VARCHAR(4),@Ayear)+'-12'+'-'+CONVERT(VARCHAR(4),@BEGINday)
    SET @EsettlementTime = CONVERT(VARCHAR(4),@NextYear)+'-01'+'-'+CONVERT(VARCHAR(4),@ENDday)
   END
   ELSE
   BEGIN
    SET @BsettlementTime = CONVERT(VARCHAR(4),@Ayear)+'-'+CONVERT(VARCHAR(4),@Amonth)+'-'+CONVERT(VARCHAR(4),@BEGINday)
    SET @EsettlementTime = CONVERT(VARCHAR(4),@Ayear)+'-'+CONVERT(VARCHAR(4),@NextMonth)+'-'+CONVERT(VARCHAR(4),@ENDday)  
   END
  END

  IF(@BsettlementTime <=GETDATE() AND @EsettlementTime >= GETDATE())
   BEGIN
    SET @returnval = 0
   END
   ELSE
   BEGIN
    SET @returnval = 1
   END 
 INSERT @table SELECT @BsettlementTime,@EsettlementTime,@returnval
 RETURN
END
GO

转载于:https://www.cnblogs.com/nxping/archive/2010/05/28/1746144.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

N Queen(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; main.c #include <stdio.h>/* 程序描述&#xff1a;输出N*N中符合左右对角线与上下左右方向都没被使用的位置在每一行的所有情况使用检测左上角&#xff0c;正上角&#xff0c;右上…

kotlin 计算平方_Kotlin程序计算自然数之和

kotlin 计算平方Given a number number, and we have to calculate the sum of all natural numbers from 1 to number. 鉴于一些数字 &#xff0c;我们必须从1计算所有自然数的总和数量 。 Example: 例&#xff1a; Input:number 15Output:120用于计算Kotlin中自然数之和的…

Python-身份证核对

中华人民共和国居民身份证号码由17 位数字和1位校验码组成。其中&#xff0c;前6位为所在地编号&#xff0c;第7~14 位为出生年月日&#xff0c;第15~17位为登记流水号&#xff0c;其中第17位偶数为女性&#xff0c;奇数为男性。校验码的生成规则如下: 将前面的身份证号码17位数…

VC 加载套接字库

//加载套接字库 WORD wVersionRequested;//套接字库版本信息 WSADATA wsaData; int err; wVersionRequested MAKEWORD(1,1); err WSAStartup(wVersionRequested,&wsaData); if(err ! 0){ //加载失败 return; } if(LOBYTE(wsaData.wVersion) ! 1 || //判断是不是所请求的…

统计各种字符个数

#include <stdio.h> #include <conio.h>int main(int argc, char * argv[]) {char ch;int letters 0, space 0, digit 0, others 0;printf("请输入一组字符串:\n");while((chgetchar())!\n){if(ch>a && ch < z || ch >A &&…

树存储结构(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; LinkList.h LinkList.c 线性表 GTree.h #ifndef _GTREE_H_ #define _GTREE_H_typedef void GTree;//定义树类型 typedef void GTreeData;//定义节点中存放数据的类型 typedef void (GTre…

Python-《twinkle twinkle little star》统计单词出现次数

统计英文儿歌《twinkle twinkle little star》中&#xff0c;使用到的单词及其出现次数。要求去除单词大小写的影响&#xff0c;不统计标点符号的个数&#xff0c;并按降序输出。 Twinkle, twinkle, little star, How I wonder what you are! Up above the world so high, Like…

二元矩阵峰值搜索_好斗的牛(二元搜索)

二元矩阵峰值搜索A farmer has built a long barn with N stalls. The stalls are placed in a straight manner at positions from x1, x2, ...xN. But his cows (C) are aggressive and don’t want to be near other cows. To prevent cows from hurting each other, he wan…

WinForm Paenl里面添加Form

Form7 f7 new Form7();f7.TopLevel false;f7.Parent this.panel1;this.panel1.Controls.Add(f7);f7.Show();转载于:https://www.cnblogs.com/Haibocai/archive/2012/10/30/2746003.html

跳跃表SkipList

跳跃表(Skip List)是一种随机化数据结构&#xff0c;基于并联的链表&#xff0c;其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间)。 基本上&#xff0c;跳跃列表是对有序的链表增加上附加的前进链接&#xff0c;增加是以随机化的方式进行的&#xff0c;所以在列…

Python---冒泡排序、选择排序

冒泡排序 依次输入n个数&#xff0c;进行冒泡排序 冒泡排序法&#xff0c;即两个相邻的进行比较&#xff0c;比较之后换位置 def bubbleSort(arr):n len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j1] :arr[j], arr[j1] arr[j1], arr[j]arr[] n…

react js 添加样式_如何在React JS Application中添加图像?

react js 添加样式Hello! In this article, we will learn how to add images in React JS? I remember when I just started coding in React JS, I thought adding images would be done exactly as it is in HTML. I later realized that it was different. 你好&#xff0…

二叉树(多路平衡搜索树)-(代码、分析、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; BTree.h #ifndef _BTREE_H_ #define _BTREE_H_#define BT_LEFT 0 //定义左子节点标识 #define BT_RIGHT 1 //定义右子节点标识typedef void BTree;//定义树类型 typedef unsigned long lo…

window service服务安装错误

今天按照园子里面的文章&#xff0c;弄了一个系统服务&#xff0c;可是一直装不上去&#xff0c; 正在运行事务处理安装。 正在开始安装的“安装”阶段。查看日志文件的内容以获得 D:\TecCreateSvc\TecJsCreateService.exe 程序集的进度。该文件位于 D:\TecCreateSvc\TecJsCre…

DM9000调试记录

最近在调试DM9000&#xff0c;遇到了很多问题&#xff0c;在网上几乎也能找到同样的问题&#xff0c;但是答案千变万化&#xff0c;弄的我这样不行&#xff0c;那样也不行。 1、遇到的第一个问题&#xff0c;网卡不识别&#xff0c;出现的调试信息就是&#xff1a; dm9000 dm90…

Python---二分法查找

输入n个数&#xff0c;通过二分法查找该数的下标 def binarySearch(arr,value):m 0#开始n len(arr#最后)while m<n:mid(mn)//2#计算中间位置if valuearr[mid]:#查找成功&#xff0c;返回元素对应的位置return midelif value>arr[mid]:#在后面一半元素中继续查找mmid1e…

Python datetime isocalendar()方法与示例

Python datetime.isocalendar()方法 (Python datetime.isocalendar() Method) datetime.isocalendar() method is used to manipulate objects of datetime class of module datetime. datetime.isocalendar()方法用于操作模块datetime的datetime类的对象。 It uses a dateti…

ASP.NET 技术(附翻译)

1.构建 ASP.NET 页面ASP.NET 和ASP.NET结构ASP.NET 是微软.NET framework整体的一部分, 它包含一组大量的编程用的类&#xff0c;满足各种编程需要。 在下列的二个部分中, 你如何学会 ASP.NET 很适合的放在.NET framework, 和学会能在你的 ASP.NET 页面中使用语言。.NET类库假想…

SQL捕获异常

原文地址 http://technet.microsoft.com/zh-cn/office/ms179296%28vsql.100%29在 Transact-SQL 中使用 TRY...CATCHTransact-SQL 代码中的错误可使用 TRY…CATCH 构造处理&#xff0c;此功能类似于 Microsoft Visual C 和 Microsoft Visual C# 语言的异常处理功能。TRY…CATCH …

二叉树遍历(代码,分析,汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; BTree.h BTree.c 二叉树&#xff08;多路平衡搜索树&#xff09; LinkQueue.h #ifndef _LINKQUEUE_H_ #define _LINKQUEUE_H_typedef void LinkQueue;//定义队列类型LinkQueue* LinkQueu…