Как выполнить несколько циклов while или вложенных циклов while из параметров в SQL Server - PullRequest
0 голосов
/ 07 мая 2019

Мне нужно выполнить скрипт с несколькими циклами while. Пример Мне нужно вставить данные с приращением, а также нужно будет вставить данные на основе поля даты.

Пока петли 1,3 работают нормально. Я могу вставить данные, но цикл while 2 выполняется как условие, что означает, что вставлено только начальное значение, а другое значение не вставлено.

Есть ли что-то, что я пропускаю или это невозможно?

Я запускаю это на Azure 12.0.2000.8

DECLARE @cnt INT = 1
DECLARE @Pcnt INT = 1

DECLARE @name VARCHAR(150), @startval decimal(16,8), @endval decimal(16,8), @incval decimal(16,8), @Startdt DATETIME, @Enddt DATETIME


WHILE @cnt<=(SELECT MAX(id)FROM #temp)   --- While loop 1
BEGIN

SELECT @name=name,@startval=startval,@endval=ENDval,@incval=inc,@Startdt=Startdt,@Enddt=ENDdt  FROM #temp where id=@cnt

        WHILE @Startdt<=@Enddt    -- While loop 2
        BEGIN 

                WHILE @startval<=@endval    --- While loop 3
                BEGIN

                        INSERT INTO #FinalTable
                        VALUES
                            (  @Startdt, @name, @startval, GETDATE() )

                        SET @startval=@startval+@incval
                END

        SET @Startdt= DATEADD(dy,7,@Startdt)

        END 

SET @cnt=@cnt+1

END

Ниже приведен мой набор результатов #temp Table:

id  name    startval    ENDval      inc         Startdt     ENDdt
1   Test1   0.00000000  0.95000000  0.19000000  2018-07-06  2019-03-22 
2   Test2   0.00000000  3.00000000  0.60000000  2018-07-06  2019-03-22 
3   Test3   0.00000000  2.50000000  0.50000000  2018-07-06  2019-03-22 
4   Test4   0.00000000  4.00000000  0.80000000  2018-07-06  2019-03-22 

Это результат, который я получаю для текущей процедуры,

SELECT WeekEndingDate,MetricType,MetricValue,InsertDate FROM #FinalTable

WeekEndingDate  MetricType  MetricValue InsertDate
2018-07-06 00:00:00.000 Test1   0.00000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.19000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.38000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.57000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.76000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.95000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test2   0.00000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test2   0.60000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test2   1.20000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test2   1.80000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test2   2.40000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test2   3.00000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test3   0.00000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test3   0.50000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test3   1.00000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test3   1.50000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test3   2.00000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test3   2.50000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test4   0.00000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test4   0.80000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test4   1.60000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test4   2.40000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test4   3.20000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test4   4.00000000  2019-05-07 18:14:29.083

Мне на самом деле понадобится результат для #FinalTable, как показано ниже: для Test1 у нас должны быть все инкрементные значения для каждой даты, но в настоящее время он вставляет только записи для: 2018-07-06 00: 00: 00.000 даты.

WeekEndingDate  MetricType  MetricValue InsertDate
2018-07-06 00:00:00.000 Test1   0.00000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.19000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.38000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.57000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.76000000  2019-05-07 18:14:29.080
2018-07-06 00:00:00.000 Test1   0.95000000  2019-05-07 18:14:29.080
2018-07-13 00:00:00.000 Test1   0.00000000  2019-05-07 18:14:29.080
.
.
2019-03-22 00:00:00.000 Test1   0.95000000  2019-05-07 18:14:29.080
.
.
2018-07-06 00:00:00.000 Test4   0.00000000  2019-05-07 18:14:29.080
.
.
2019-03-22 00:00:00.000 Test4   3.20000000  2019-05-07 18:14:29.080
2019-03-22 00:00:00.000 Test4   4.00000000  2019-05-07 18:14:29.083

1 Ответ

0 голосов
/ 07 мая 2019

Вам необходимо каждый раз сбрасывать @startval после третьего цикла.

В противном случае он больше не войдет в третий цикл.

    WHILE @Startdt <= @enddt
    BEGIN
                 WHILE @startval<=@endval
                 BEGIN
                 INSERT INTO #Final
                 VALUES
                        (  @Startdt, @name, @startval, GETDATE() )

                 SET @startval=@startval+@incval
                 END

                 select @startval = startval from #temp where id=@cnt 
                 --Above is what you need to add 
                 SET @Startdt = DATEADD(DAY,7,@Startdt)
    END

Результат теста:

DB <> Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...