在T-SQL函数中使用while循环

时间:2012-10-08 06:56:08

标签: sql sql-server-2008 tsql

非数据库程序员在这里。它发生了,我需要在T-SQL中创建一个函数,它返回给定日期之间的工作日计数。我认为最简单的方法是使用 while 循环。问题是,一旦我写了像

这样的东西
while @date < @endDate
begin

end

该语句将不会执行,声称“关键字'返回'附近的语法不正确”(不是很有用)。问题出在哪里?

P.S。完整代码:

ALTER FUNCTION [dbo].[GetNormalWorkdaysCount] (
@startDate DATETIME,
@endDate DATETIME
)   
RETURNS INT

AS
BEGIN
    declare @Count INT,
            @CurrDate DATETIME
    set @CurrDate = @startDate

    while (@CurrDate < @endDate)
    begin

    end

    return @Count
END
GO

2 个答案:

答案 0 :(得分:5)

与某些语言不同,SQL Server中的BEGIN/END对不能为空 - 它们必须包含至少一个语句。


至于你的实际问题 - 你说过你不是一名DB程序员。 SQL的大多数初学者倾向于沿着相同的路线 - 试图编写程序代码来解决问题。

然而,SQL是一种基于集合的语言 - 通常最好找到基于集合的解决方案,而不是使用循环。

在这种情况下,日历表将是一个真正的帮助。这样的表包含每个日期的一行,以及表示您的业务有用信息的其他列(例如您认为是工作日)。然后,它使您的工作日查询看起来像:

SELECT COUNT(*) from Calendar
where BaseDate >= @StartDate and BaseDate < @EndDate and IsWorkingDay = 1

填充日历表变为一次性练习,您可以使用例如填充它。 30年的约会很容易。

答案 1 :(得分:3)

在SQL服务器中使用任何循环绝不是一个好主意:)

有一些更好的解决方案,参考StackOverflow already上提供的解决方案。