游戏ui设计网站东莞网站建设招聘
news/
2025/9/22 18:33:28/
文章来源:
游戏ui设计网站,东莞网站建设招聘,如何对现有的网站改版,做电商必备的几个软件SQL表值函数和标量值函数的区别 写sql存储过程经常需要调用一些函数来使处理过程更加合理#xff0c;也可以使函数复用性更强#xff0c;不过在写sql函数的时候可能会发现#xff0c;有些函数是在表值函数下写的有些是在标量值下写的#xff0c;区别是表值函数只能返回一个… 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 nodeCount5 from MenuTree return nodeCount END 这个函数很简单返回一个整型值然后就可以在存储过程中调用了不过调用的方式有所不同象上面的表值函数调用是不需要所有者的只要写函数名称就可以对于标量值函数来说是需要加上所有者的比如所有者是dbo select dbo.testGetSubNodes_,这样就可以返回5如果不加dbo那sql会不认识这个函数。 以下是本人写的例子 SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- -- 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) ASBEGIN -- 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 ModuleIDModuleID AND RegionIDRegionID AND isvalid1 IF(AdayBEGINday AND AdayBEGINday ) --上月和本月(都小于) BEGIN SET PreMonth Amonth-1 IF(PreMonth0)---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(AdayBEGINday AND AdayBEGINday ) --本月和下月大于 BEGIN SET NextMonth Amonth1 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 ENDGO 转载于:https://www.cnblogs.com/nxping/archive/2010/05/28/1746144.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909985.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!