此函数返回单个日期,而不是预期的61个日期的列表。有什么想法我做错了吗?
alter FUNCTION udf_foo()
RETURNS @Result TABLE
(
days datetime
)
AS
begin
DECLARE @i int = -1
begin
WHILE @i < 60
SET @i = @i + 1
INSERT into @Result select dateadd (day, -@i, getdate())
end ;
return;
end
答案 0 :(得分:2)
就像您编写它一样,WHILE
循环的主体仅跨越下一条语句。
您只会得到一个结果,因为INSERT
不是循环主体的一部分,并且只执行一次(在循环将@i
增大为60
之后)。
如果要包含一个以上的语句主体,请将这些语句括在BEGIN ... END
块中。
...
WHILE @i < 60
BEGIN
SET @i = @i + 1;
INSERT INTO @Result
SELECT dateadd(day, -@i, getdate());
END;
...
答案 1 :(得分:1)
您可以为此使用CTE:
with dates as (
select cast(getdate() as date) as dte
union all
select dateadd(day, -1, dte)
from dates
where dte >= dateadd(day, -60, getdate())
)
select *
from dates;
您几乎不需要此功能,尽管如果您确实愿意可以将其放入功能中。
Here是将其合并到视图中的示例。