Лучший способ синхронизировать два идентификатора - создать постоянный вычисляемый столбец на основе фактического столбца идентификаторов. Где Col1 - столбец идентификаторов, а Col2 - постоянный вычисляемый столбец, который является результатом некоторой формулы на основе Col1. Затем вы даже можете Создать индексы для вычисляемых столбцов .
проверить это:
CREATE TABLE YourTable
(Col1 int not null identity(2000000,1)
,Col2 AS (Col1-2000000+3000000) PERSISTED
,Col3 varchar(5)
)
GO
insert into YourTable (col3) values ('a')
insert into YourTable (col3) SELECT 'b' UNION SELECT 'c'
SELECT * FROM YourTable
ВЫВОД:
Col1 Col2 Col3
----------- ----------- -----
2000000 3000000 a
2000001 3000001 b
2000002 3000002 c
(3 row(s) affected)
РЕДАКТИРОВАТЬ После комментариев ОП я все еще не уверен на 100%, что вы после.
Я никогда не использовал SQL Server 2000 (мы пропустили эту версию), и я действительно не хочу искать, как сделать все в этой версии, он настолько ограничен без предложения OUTPUT и ROW_NUMBER (), CTE и т. Д. .
Я могу придумать три способа сделать:
1) Вы можете просто создать таблицу последовательности, в которой у вас есть 2 строки, одна для A и одна для B, каждый раз, когда вам нужно вставить одну, искать, увеличивать и сохранять значение нужного вам типа seq а затем вставить с этим значением. например, если вы вставляете строку типа «A», сделайте следующее:
INSERT INTO test2
(col1, col2, col3,...)
SELECT
ISNULL(MAX(NextSeq),0)+1, col2, col3,...
FROM YourSequenceTable WITH (UPDLOCK, HOLDLOCK)
WHERE SequenceType='A'
UPDATE YourSequenceTable
SET NextSeq=ISNULL(NextSeq,0)+1
WHERE SequenceType='A'
2) измените структуру таблицы, чтобы просто сохранить данные в Tsel или Tadv, и вставьте триггер в третью общую таблицу таблиц, где вы можете иметь дополнительную «общую» идентификацию. общая таблица будет выглядеть как
CommonTable
ID int not null indentity(1,1) primary key
TselID int null FK to Tsel.PK
TadvID int null FK to Tadv.PK
3) если вам нужна одна таблица, попробуйте это, что является настоящим хаком. Измените таблицы Tsel и Tadv так, чтобы они содержали все необходимые столбцы и из приложения INSERT INTO Tsel
, когда значение равно select
, и триггер захватывает это значение идентификатора, а затем вставляет его в test2, затем удаляет данные из tsel. Затем из приложения, когда значение равно adv
, просто INSERT INTO Tadv
, есть триггер для этой таблицы, вставьте данные в test2 и удалите данные из Tadv. Вам нужно иметь все столбцы данных в Tsel и Tadv, чтобы триггер мог скопировать значения в test2, но триггер удалит строки оттуда (идентичность будет последовательной, даже если исходные строки будут удалены).
Ваш триггер Tsel будет выглядеть так:
CREATE Trigger MAKEANID2_Tsel ON dbo.Tsel
AFTER INSERT
AS
--copy data from Tsel into test2., test2 can still have its own identity value
INSERT INTO test2
(PK, col1, col2, col3,...)
SELECT
col0, col1, col2, col3,....
FROM INSERTED
--remove rows from Tsel, which were just copied and not needed anymore.
DELETE Tsel
WHERE PK IN (SELECT PK FROM INSERTED)
GO