我需要能够选择特定的行,因为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
答案 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'));