选择行的迭代循环

时间:2018-06-20 12:08:04

标签: sql sql-server

我需要能够选择特定的行,因为SET仅保存一行。

在第5行,我必须声明@json,以便OPENJSON可以工作。

这就是为什么我现在在查询中需要RowNo的原因。但是,此时尚未定义RowNo

我将如何解决此问题?似乎旋转的方式无关紧要,某些东西总是不确定的。我如何根据需要指向第5行上的特定row

DECLARE @loopCounter INT = 0;
WHILE @loopCounter < (SELECT count(Id) FROM ProcessEventMessages)
BEGIN
    PRINT 'Changing...';
DECLARE @json NVARCHAR(MAX) = (SELECT Data FROM ProcessEventMessages WHERE RowNo = @loopCounter) -- here
SELECT * FROM OPENJSON(@json) 
WITH (  
    message varchar(200) '$.message',
    machineId varchar(200) '$.machineId',
    machineName int '$.machineName',
    ipAddress varchar(200) '$.ipAddress',
    LocalTime datetime2(7) '$.time'
 )  AS ChangeTime;

   ;WITH CTE AS(
    SELECT *,ROW_NUMBER() OVER(Order by Id ASC) AS RowNo
    FROM ProcessEventMessages 
    )
    UPDATE CTE 

    SET Data = JSON_MODIFY(@json,'$.time', FORMAT(DATEADD(hour,-2,JSON_VALUE(@json,'$.time')),'yyyy-MM-ddTHH:mm:ss.fff')) 
    WHERE RowNo = @loopCounter

   SET @loopCounter = @loopCounter + 1;
END;

PRINT 'Done';
GO

1 个答案:

答案 0 :(得分:1)

您可以使用CROSS APPLY而不是循环。试试:

WITH CTE AS (
    SELECT 
          LocalTime
        , Data
    FROM dbo.ProcessEventMessages
    CROSS APPLY OPENJSON(Data) 
    WITH (  
        LocalTime datetime2(7) '$.time'
     )  AS ChangeTime
    )
UPDATE CTE 
    SET Data = JSON_MODIFY(Data,'$.time', FORMAT(DATEADD(hour,-2,LocalTime),'yyyy-MM-ddTHH:mm:ss.fff'));