SQL Server 中奇怪的 Return

    今天帮同事查找一个函数中的bug。给我的源代码如下:
None.gif if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [tb_Holiday] ' and   OBJECTPROPERTY (id, N ' IsUserTable ' =   1 )
None.gif
drop   table   [ tb_Holiday ]
None.gif
GO
None.gif
-- 定义节假日表
None.gif
CREATE   TABLE  tb_Holiday(
None.gifHDate 
smalldatetime   primary   key   clustered -- 节假日期
None.gif
Name  nvarchar ( 50 not   null )              -- 假日名称
None.gif
GO
None.gif
if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[f_WorkDay] ' and  xtype  in  (N ' FN ' , N ' IF ' , N ' TF ' ))
None.gif
drop   function   [ dbo ] . [ f_WorkDay ]
None.gif
GO
None.gif
-- 计算两个日期之间的工作天数
None.gif
CREATE   FUNCTION  f_WorkDay(
None.gif
@dt_begin   datetime ,   -- 计算的开始日期
None.gif
@dt_end    datetime     -- 计算的结束日期
None.gif
) RETURNS   int
None.gif
AS
None.gif
BEGIN
None.gif 
IF   @dt_begin > @dt_end
None.gif  
RETURN ( DATEDIFF ( Day , @dt_begin , @dt_end )
None.gif   
+ 1 - (
None.gif    
SELECT   COUNT ( * FROM  tb_Holiday
None.gif    
WHERE  HDate  BETWEEN   @dt_begin   AND   @dt_end ))
None.gif 
RETURN ( - ( DATEDIFF ( Day , @dt_end , @dt_begin )
None.gif  
+ 1 - (
None.gif   
SELECT   COUNT ( * FROM  tb_Holiday
None.gif   
WHERE  HDate  BETWEEN   @dt_end   AND   @dt_begin )))
None.gif
END
None.gif
GO

    执行如下查询:
    select dbo.f_workday('2006-01-01','2006-02-01')
    select dbo.f_workday('2006-02-01','2006-01-01')
    和理想结果相差悬殊啊。
    虽然上本身就有逻辑的错误,但主要的问题不在这里。当时就怀疑实际语句的执行情况是否正确,测试后发现一个奇怪的问题。就是不管在函数还是存储过程中,return 后面加上确切的数字和简单的算术计算都没问题,都可以使函数或存储过程立刻返回。但是返回值中如果包含查询语句,如:return (select count(*) from TableName),那么函数或存储过程将继续执行,如果后面没有另外的return,外面得到的返回值倒是还能记得之前那个返回值(就是return (select count(*) from TableName)这句的返回值)。百思不得其解,网上随便查了查,没找到原因。难道return 后面的表达式不能是一个子查询?看看有哪位高手知晓其根本原因。

转载于:https://www.cnblogs.com/allanlau2004/archive/2006/07/21/456648.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值