У меня есть следующая таблица
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 ), которые выполняют следующие шаги:
- УДАЛИТЬ ИЗ [MyTable], ГДЕ [Постоянный] НЕДЕЙСТВИТЕЛЕН *
- (много вычислений)
- Вставить результаты пункта 2 в [MyTable]
MySP запускается каждый день, поэтому число [Idx] очень быстро увеличивается, так как каждый день 500.000 строк удаляются и вставляются.Моя цель во время выполнения SP - сбросить значение столбца [Idx], чтобы поддерживать максимально возможное число [Idx] ниже.
1-я попытка
Я пытался обновить следующий запрос в конце 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]
Вторая попытка После прочтения следующих двух вопросов/ answers
Я добавил следующее в конце MySP
DBCC CHECKIDENT ('MyTable', RESEED, 1);
, но также это не работает, поскольку в [MyTable], в отличие от ситуации обоих вопросов, остаются некоторые строкиТаким образом, существует конкретный риск того, что [Idx] не является уникальным, и это не хорошо, поскольку [Idx] является моим первичным ключом.
Как я могу сбросить значение столбца идентификаторов, а также строки, которые до сих поростается в [MyTable]?