重置 IDENTITY 列而不删除所有行

Reset IDENTITY column whitout deleting all rows

我有以下table

CREATE TABLE [dbo].[MyTable](
    [Name] NVARCHAR(200) NOT NULL,
    [Surname] NVARCHAR(200) NOT NULL,
    [Permanent] [bit] NULL,
    [Idx] [bigint] IDENTITY(1,1) NOT NULL
 CONSTRAINT [MyTable] PRIMARY KEY CLUSTERED 
(
    [Idx] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

包含 1000 行 [Permanent]=1 和 500.000 行 [Permanent] NULL

此外,我还有一个存储过程(称为 MySP),它执行以下步骤:

  1. 从 [MyTable] 中删除 [Permanent] 为空的地方
  2. (大量计算)
  3. 将点 2 的结果插入 [MyTable]

MySP 每天运行,因此 [Idx] 的数量增加得非常快,因为每天有 500.000 行被删除和插入。 我的目标是,在 SP 执行期间,重置列 [Idx] 的值以保持 [Idx] 的最大数量尽可能低。

第一次尝试

我尝试在 MySP 末尾使用以下查询进行更新,但系统给了我一个(正确的)错误。

UPDATE A
SET A.[Idx]=B.[Idx_new]
FROM [dbo].[MyTable] A
INNER JOIN (
    SELECT [Idx],ROW_NUMBER() OVER (ORDER BY [Idx]) AS [Idx_new]
    FROM [dbo].[MyTable]
) B
ON A.[Idx]=B.[Idx]

第二次尝试 看了下面两个questions/answers

我在 MySP 的末尾添加了以下内容

DBCC CHECKIDENT ('MyTable', RESEED, 1); 

但这也不像在 [MyTable] 中那样有效,与两个问题的情况不同,保留了一些行,因此 [Idx] 不是唯一的并且不如 [ Idx] 是我的主键。

如何重置标识列值以及仍然保留在 [MyTable] 中的行?

使用 @Killer Queen 建议,我已经使用这段代码解决了问题,它在 DELETE 之后找到了 MyTableMAX([Idx]) 并且在新 INSERT.

之所以有效,是因为带有 [Permanent]=1 的行是插入 table 中的第一行,因此它们的 [Idx] 值从 1 开始并且非常低。

DELETE 
FROM [MyTable]
WHERE [Permanent]!=1 OR [Permanent] IS NULL

DECLARE @MaxIdx As bigint
SET @MaxIdx = (SELECT ISNULL(MAX([Idx]),0) FROM [MyTable])

DBCC CHECKIDENT ('MyTable', RESEED, @MaxIdx);