使用SQL更正数字序列

使用SQL更正数字序列,sql,sql-server,tsql,Sql,Sql Server,Tsql,有没有一种方法可以使用T-SQL更正某个表列中自动递增的数字序列 假设我有一张这样的桌子: Id Bar Foo 2 5 1 3 6 1 21 7 1 22 16 1 154 17 1 176 18 1 我想用Foo=1更新行,这样它可以继续Bar列序列,从具有特定Id的行开始(在这种情况下,让我们选择具有Id=21的行),并基于Id列顺序将其应用于所有后续行 最终结果将是: Id Bar

有没有一种方法可以使用T-SQL更正某个表列中自动递增的数字序列

假设我有一张这样的桌子:

 Id   Bar  Foo
  2     5    1 
  3     6    1
 21     7    1
 22    16    1
154    17    1
176    18    1
我想用
Foo=1
更新行,这样它可以继续
Bar
列序列,从具有特定
Id
的行开始(在这种情况下,让我们选择具有
Id=21
的行),并基于
Id
列顺序将其应用于所有后续行

最终结果将是:

 Id   Bar  Foo
  2     5    1 
  3     6    1
 21     7    1
 22     8    1
154     9    1
176    10    1
有关更多上下文:

该表存储特定位置的文件数据(示例中的位置Id为“Foo”)。每一行都是一个文件,并且有其文件号(文件号是示例中的“Bar”)


文件编号是基于该位置的当前最大文件编号在文件创建时确定的。由于某些错误,文件编号跳过了一些,在文件编号顺序中留下了一个间隙,我想使用T Sql来修复该间隙。

假设
Id
是确定行顺序的字段,您可以使用以下查询来更新

;WITH ToUpdate AS (
    SELECT Id, Bar, 
           FIRST_VALUE(Bar) OVER (ORDER BY Id) + 
           ROW_NUMBER() OVER (ORDER BY Id) - 1 AS newBar
    FROM mytable
    WHERE Foo = 1 AND Id >= 21
)
UPDATE ToUPDATE
SET Bar = newBar


如注释中所述,您可以从类似于
CTE
所使用的查询中获取
Bar
值。因此,没有必要在表的列中保留这样的值。

当你说“自动递增”时,你到底在说什么?标识列?让我们选择Id=14的行。。。提供的数据中没有这样的行如果您只需要一个与数据无关的哑递增值(如果您可以将16重置为8,17重置为9,并且没有影响,这有什么意义?),为什么不在查询数据时生成此序列呢?ROW_NUMBER()可以做到这一点,而无需维护列。存储这些无意义数据的问题是,每次更改任何行时都必须重置它。@Giorgosbetos编辑了post,但不要试图在数据库表中保留连续递增的数字。这注定会失败——就像Aaron Bertrand在他的评论中写道的那样——使用ROW_NUMBER()代替。