Sql 根据行号选择ID

Sql 根据行号选择ID,sql,Sql,这是我的桌子 | | Id | |1 |07A83EA7-6E00-4265-906C-FF187FE18EB3| |2 |B6C10F47-7DEE-4D2B-AA3D-FF27B8FC105C| |3 |10F56030-0803-4133-B57B-FF3F941A0D60| 是否可以根据行号选择Id 我试过: SELECT [Id],ROW_NUMBER() OVER(Order by Id

这是我的桌子

|  | Id                                 |
|1 |07A83EA7-6E00-4265-906C-FF187FE18EB3|
|2 |B6C10F47-7DEE-4D2B-AA3D-FF27B8FC105C|
|3 |10F56030-0803-4133-B57B-FF3F941A0D60|              
是否可以根据行号选择Id

我试过:

SELECT [Id],ROW_NUMBER() OVER(Order by Id ASC) AS RowLol, Id
但这并不是我想要的功能,因为它会生成一个临时字段

所需功能:

能够遍历所有条目,并将其用作循环中更新的参数

--DECLARE @json NVARCHAR(MAX) = (SELECT Data FROM ProcessEventMessages WHERE Id='AEF11F7B-06C1-4C40-9806-0004CAC6A042')
-- This will only work for ONE instance. Hence why i need an iterative ID, to pass along 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;



--loop on id
DECLARE @loopCounter INT = 0;

WHILE @loopCounter < (SELECT count(Id) FROM ProcessEventMessages)
BEGIN
PRINT 'changing values...';

UPDATE ProcessEventMessages SET Data = JSON_MODIFY(@json,'$.time', FORMAT(DATEADD(hour,-2,JSON_VALUE(@json,'$.time')),'yyyy-MM-ddTHH:mm:ss.fff')) WHERE ROWNUMBER = @loopCounter)
SET @loopCounter = @loopCounter + 1;
END;

PRINT 'done';
GO

假设您使用sql server作为dbms,现在如果我正确理解了您的需求,那么您可能需要

更新

如果您尝试将update命令与cte表单集成,则可能会出现如下情况

;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

注意:我不确定id上的行号是否一致。因为如果插入新ID,那么行号可能会发生变化。

生成新的本地字段是什么意思?您的问题不清楚。您必须添加数据和预期输出。如果这是你的数据,就我所见,它已经有了一个Id,所以我不明白你为什么要添加一个新的Id。此外,您不会谈论您正在使用的rdbmsusing@IMSoP它不是我表中的永久字段,这就是我的意思,这就是为什么在这种情况下它对我不起作用的原因。@JaimeDrq我提供了一个我所想的伪版本。希望这能更清楚地说明这一点。顺便说一句,据我所知,您的示例并没有按Id的顺序显示行,并且在插入新条目时,按GUID/UUID排序不会给您提供一致的行号。我有点搞不懂你到底用这个干什么。嘿,是的,这就是我的想法。我会将整个查询更新为该问题,以提供更多上下文。请参阅ROWNUMBER==@loopCounter所在的行。希望这能进一步阐明提取行数的目的。非常感谢您的努力。你介意看一下问题的建议部分吗?我试图实现你的解决方案,但是,我不确定我是否完全理解如何使用你的解决方案。你正确地集成了它。更新操作中是否有任何错误或没有结果。更新:MSSMS在执行查询时崩溃哈哈。然而,我认为我的问题应该受到责备。我无法访问RowNo的@json值。让我更新代码以向您展示虽然此代码可以回答问题,但最好解释如何解决问题,并提供代码作为示例或参考。只有代码的答案可能会令人困惑,并且缺乏上下文。
select foo.*
from (
select ROW_NUMBER() OVER () as rownum, * from mytable ) as foo
where rownum=5
DECLARE @RowNrr int = (SELECT *,ROW_NUMBER() OVER(Order by Id ASC) AS RowNrr FROM ProcessEventMessages)
SET @json = (SELECT Data FROM ProcessEventMessages WHERE @RowNrr = @loopCounter)
...
and then
...

;WITH CTE AS(
    SELECT @RowNrr
)

but it doesn't work :/
;WITH CTE AS(
   SELECT [Id],
          ROW_NUMBER() OVER(Order by Id ASC) AS RowNo
   FROM TableName
)
SELECT ID
FROM CTE
WHERE RowNo IN(1,2,3)
;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
select foo.*
from (
select ROW_NUMBER() OVER () as rownum, * from mytable ) as foo
where rownum=5