Самый безопасный способ, который я могу придумать, - создать нечто похожее на объект последовательности Oracle.В этом блоге консультативной группы по работе с клиентами по разработке Microsoft SQL Server есть хороший пример: *1002* (я предпочитаю вариант 2).
Вы должны создать последовательность для каждой вставленной родительской строки:
EXEC usp_CreateNewSeq N'ParentSeq' + @parentId
и получите следующую последовательность для каждой строки в таблице сопоставления:
INSERT INTO [table] VALUES (@childId, @parentId, EXEC 'GetNewSeqVal_'+ @parentId)
Я не уверен в своем синтаксисе и не могу проверить его на знание, поэтомуне стесняйтесь меня поправлять.
Более простой метод: добавить столбец в родительскую таблицу с именем MaxChildId
со значением по умолчанию = 0. Каждый раз, когда вы добавляете дочернюю строку, вы должны обновлятьэтот столбец и используйте его новое значение как DisplayID
.
declare @vid int
UPDATE [ParentTable]
SET @vid = MaxChildId+1, MaxChildId = MaxChildId+1
WHERE Id = ParentID
select @vid
. Этот метод может вызвать совпадения при обновлении родительской таблицы.
После всего сказанного, я думаю, вам лучшерассмотреть редизайн для решения этой проблемы.