SQL L oop не зацикливается - PullRequest
0 голосов
/ 03 апреля 2020

Я должен повторять определенный c бит кода для каждого месяца, поэтому я подумал собрать все oop.

DECLARE @Startdate DATE = '20200101';
DECLARE @Enddate   DATE = '20210101';

WHILE (@Startdate < @Enddate) 
BEGIN
    SELECT Rapportagedatum, Boekdatum, Rekeningnr, Bedrag, Uw_referentie         
    FROM FC_GBRMUT (nolock) 
    WHERE RekeningNr = 14050  
      AND MONTH(Rapportagedatum) = MONTH(@Startdate) 
      AND YEAR(Rapportagedatum) = YEAR(@Startdate)
      AND Boekdatum < @Startdate

    SET @Startdate = DATEADD(m, 1, @Startdate)
END

Теперь проблема в том, что он отказывается от l oop. Если я удаляю AND Boekdatum < @Startdate, это показывает, что только январь извлекается из базы данных.

Как мне исправить это, чтобы он работал в течение всего года?

Ответы [ 3 ]

0 голосов
/ 03 апреля 2020

Зачем вообще беспокоиться о al oop ??

Просто напишите это в одном простом утверждении:

SELECT Rapportagedatum, Boekdatum, Rekeningnr, Bedrag, Uw_referentie         
FROM FC_GBRMUT
WHERE RekeningNr = 14050  
  AND Boekdatum BETWEEN @StartDate AND @Enddate

Готово! Без циклов, без ненужной обработки RBAR (строка за агонизирующей строкой)

0 голосов
/ 03 апреля 2020

Как уже упоминалось, L oop работает на меня. Мне интересно, почему вы сначала используете WHILE L OOP, но давайте пока не будем сомневаться в этом.

Я создал следующий минимальный пример. Давайте предположим, что ваши данные выглядят одинаково, тогда ваши результаты не будут возвращать ничего, потому что Boekdatum не меньше чем StartDate для каждого L oop, но равно StartDate. Поэтому в строке AND Boekdatum <= @Startdate я заменил = на <= и удалил (nolock). Может быть, это решит ваш "не работает" L OOP.

DECLARE @FC_GBRMUT table (Rapportagedatum date, Boekdatum date , Rekeningnr int , Bedrag varchar(100), Uw_referentie varchar(100))

INSERT INTO @FC_GBRMUT
SELECT '20200101', '20200101', 14050, 'RandomText', 'RandomText'
UNION SELECT '20200201', '20200201', 14050, 'RandomText', 'RandomText'
UNION SELECT '20200301', '20200301', 14050, 'RandomText', 'RandomText'
UNION SELECT '20200401', '20200401', 14050, 'RandomText', 'RandomText'
UNION SELECT '20200501', '20200501', 14050, 'RandomText', 'RandomText'
UNION SELECT '20200601', '20200601', 14050, 'RandomText', 'RandomText'
UNION SELECT '20200701', '20200701', 14050, 'RandomText', 'RandomText'
UNION SELECT '20200801', '20200801', 14050, 'RandomText', 'RandomText'
UNION SELECT '20200901', '20200901', 14050, 'RandomText', 'RandomText'
UNION SELECT '20201001', '20201001', 14050, 'RandomText', 'RandomText'
UNION SELECT '20201101', '20201101', 14050, 'RandomText', 'RandomText'
UNION SELECT '20201201', '20201201', 14050, 'RandomText', 'RandomText'

DECLARE @Startdate DATE = '20200101';
DECLARE @Enddate DATE = '20210101';

WHILE (@Startdate < @Enddate) 
BEGIN
SELECT Rapportagedatum, Boekdatum, Rekeningnr, Bedrag, Uw_referentie 
FROM @FC_GBRMUT --(nolock) 
WHERE RekeningNr =14050 
AND Month(Rapportagedatum) = MONTH(@Startdate) AND Year(Rapportagedatum) = YEAR(@Startdate)
AND Boekdatum <= @Startdate
SET @Startdate = DATEADD(m,1,@Startdate)
END
0 голосов
/ 03 апреля 2020

Я не вижу причин, почему это не будет работать, если вы не получите ошибку. Я проверил запрос ниже

DECLARE @Startdate      DATE = '20200101';
DECLARE @Enddate        DATE = '20210101';

WHILE  (@Startdate < @Enddate) 
BEGIN
    SELECT @Startdate
    SET @Startdate = DATEADD(m,1,@Startdate)
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...