今天帮同事查找一个函数中的bug。给我的源代码如下:
SQL Server 中奇怪的 Returnif exists (select * from dbo.sysobjects where id = object_id(N'[tb_Holiday]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
SQL Server 中奇怪的 Return
drop table [tb_Holiday]
SQL Server 中奇怪的 Return
GO
SQL Server 中奇怪的 Return
--定义节假日表
SQL Server 中奇怪的 Return
CREATE TABLE tb_Holiday(
SQL Server 中奇怪的 ReturnHDate 
smalldatetime primary key clustered--节假日期
SQL Server 中奇怪的 Return
Name nvarchar(50not null)             --假日名称
SQL Server 中奇怪的 Return
GO
SQL Server 中奇怪的 Return
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_WorkDay]'and xtype in (N'FN', N'IF', N'TF'))
SQL Server 中奇怪的 Return
drop function [dbo].[f_WorkDay]
SQL Server 中奇怪的 Return
GO
SQL Server 中奇怪的 Return
--计算两个日期之间的工作天数
SQL Server 中奇怪的 Return
CREATE FUNCTION f_WorkDay(
SQL Server 中奇怪的 Return
@dt_begin datetime,  --计算的开始日期
SQL Server 中奇怪的 Return
@dt_end  datetime   --计算的结束日期
SQL Server 中奇怪的 Return
)RETURNS int
SQL Server 中奇怪的 Return
AS
SQL Server 中奇怪的 Return
BEGIN
SQL Server 中奇怪的 Return 
IF @dt_begin>@dt_end
SQL Server 中奇怪的 Return  
RETURN(DATEDIFF(Day,@dt_begin,@dt_end)
SQL Server 中奇怪的 Return   
+1-(
SQL Server 中奇怪的 Return    
SELECT COUNT(*FROM tb_Holiday
SQL Server 中奇怪的 Return    
WHERE HDate BETWEEN @dt_begin AND @dt_end))
SQL Server 中奇怪的 Return 
RETURN(-(DATEDIFF(Day,@dt_end,@dt_begin)
SQL Server 中奇怪的 Return  
+1-(
SQL Server 中奇怪的 Return   
SELECT COUNT(*FROM tb_Holiday
SQL Server 中奇怪的 Return   
WHERE HDate BETWEEN @dt_end AND @dt_begin)))
SQL Server 中奇怪的 Return
END
SQL Server 中奇怪的 Return
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 后面的表达式不能是一个子查询?看看有哪位高手知晓其根本原因。

相关文章:

  • 2021-06-21
  • 2022-01-16
  • 2021-09-18
  • 2021-11-16
  • 2021-08-04
  • 2022-12-23
  • 2022-12-23
  • 2021-09-07
猜你喜欢
  • 2022-12-23
  • 2021-09-23
  • 2021-10-10
  • 2021-06-06
  • 2021-09-26
  • 2021-12-20
相关资源
相似解决方案