ifexists (select*from dbo.sysobjects where id =object_id(N'[tb_Holiday]') andOBJECTPROPERTY(id, N'IsUserTable') =1) droptable[tb_Holiday] GO --定义节假日表 CREATETABLE tb_Holiday( HDate smalldatetimeprimarykeyclustered, --节假日期 Name nvarchar(50) notnull) --假日名称 GO ifexists (select*from dbo.sysobjects where id =object_id(N'[dbo].[f_WorkDay]') and xtype in (N'FN', N'IF', N'TF')) dropfunction[dbo].[f_WorkDay] GO --计算两个日期之间的工作天数 CREATEFUNCTION f_WorkDay( @dt_begindatetime, --计算的开始日期 @dt_enddatetime--计算的结束日期 )RETURNSint AS BEGIN IF@dt_begin>@dt_end RETURN(DATEDIFF(Day,@dt_begin,@dt_end) +1-( SELECTCOUNT(*) FROM tb_Holiday WHERE HDate BETWEEN@dt_beginAND@dt_end)) RETURN(-(DATEDIFF(Day,@dt_end,@dt_begin) +1-( SELECTCOUNT(*) FROM tb_Holiday WHERE HDate BETWEEN@dt_endAND@dt_begin))) END 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 后面的表达式不能是一个子查询?看看有哪位高手知晓其根本原因。