Функция SQL, которая создает таблицу дат - PullRequest
0 голосов
/ 12 сентября 2018

Эта функция возвращает одну дату, а не список из 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

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вы можете просто использовать 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;

Вам вряд ли понадобится функция для этого, хотя вы можете поместить ее в функцию, если действительно хотите.

Здесь является примером включения этого в представление.

0 голосов
/ 12 сентября 2018

Как вы и написали, тело цикла WHILE охватывает только следующий оператор.

Вы получаете только один результат, поскольку INSERT не является частью тела цикла и выполняется толькоодин раз (после увеличения цикла @i до 60).

Если вы хотите, чтобы тело было более одного оператора, заключите операторы в блок BEGIN ... END.

...
WHILE @i < 60
BEGIN
  SET @i = @i + 1;
  INSERT INTO @Result
              SELECT dateadd(day, -@i, getdate());
END;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...