2017-02-13 4 views
0

Мне нужно создать строку инструкции T-SQL для обновления таблицы в цикле while.Как создать строку оператора T-SQL для обновления таблицы

WHILE @currentDayCount <= @amountOfDays 
BEGIN 
    SELECT @totalErros = COUNT(*) 
    FROM ErrorLog 
    WHERE StatusCode = 417 
     AND Response LIKE '%' + @mensagemResponse + '%' 
     AND CAST(CreationDate AS DATE) = CAST(@dataPesquisa AS DATE) 

    SET @SQL = 'UPDATE #AnaliseDeErros417 SET ' + 
       CAST(FORMAT(CAST(@dataPesquisa AS DATE), 'dd/MM') AS VARCHAR(10)) + 
       ' = ' + CAST(@totalErros AS VARCHAR(8)) + ' WHERE Id = ' + CAST(@contadorMensagens AS VARCHAR(1)); 

    EXECUTE(@SQL) 

    SET @dataPesquisa = DateADD(DAY, 1, @dataPesquisa) 
    SET @currentDayCount = @currentDayCount + 1; 
END 

Все работает отлично, за исключением инструкции SQL обновления.

+0

У вас действительно есть столбец для каждого dd/MM? > оберните свой код для имени столбца в 'quotename()' eg: 'quotename (CAST (FORMAT (CAST (@dataPesquisa AS DATE), 'dd/MM') AS VARCHAR (10)))' – SqlZim

+1

Похоже, вы пытаются построить сводную таблицу. Это то, что вы делаете? – SqlZim

ответ

0

Из запроса

' WHERE Id = ' + CAST(@contadorMensagens AS VARCHAR(1))

Вы обновляете же строк несколько раз. @contadorMensagens также следует обновить вместе с @dataPesquisa и @currentDayCount. Таким образом, строка, которая выполняет условие Id = ' + CAST(@contadorMensagens AS VARCHAR(1)), будет обновляться только в #AnaliseDeErros417. Также эта строка будет содержать значения из последней итерации цикла while. Если такой строки нет в AnaliseDeErros417, то никакие строки не будут обновляться.