Решение этой проблемы зависит от того, имеет ли «родительская» таблица (т. Е. Таблица с столбцом IDENTITY) естественный ключ (т. Е. Одно или несколько полей, которые при объединении гарантированно являются уникальными, другиечем суррогатный первичный ключ ).
Например, в этом случае сочетание имен и адресов всегда будет уникальным?
Если ответ да, тогда вы можетепросто вставьте в EmpBasic, не потрудившись вывести и сохранить сгенерированные идентификаторы.Затем вы можете вставить в EmpProject присоединение к EmpBasic, используя естественный ключ (например, имя и адрес), чтобы найти правильный EmpID.
Insert into EmpBasic
Select T1Name, T1Address from EmpFull_Temp
Where ObjectID < 106
Insert into EmpProject
Select A.EmpID, B.T1EmpProject from EmpBasic as A, EmpFull_Temp as B
Where A.Name = B.Name And A.Address = B.Address
Если ответ «нет», то нет простого решения, о котором я знаю- в SQL Server 2005 (я не знаю, отличается ли он в 2008 году), невозможно вывести значения OUTPUT, которые не были вставлены.Я обошел эту проблему в прошлом, используя одно из других полей (например, Имя), чтобы временно сохранить исходный идентификатор (в данном случае, ObjectID), использовать его для присоединения при вставке дочерних записей, как описано выше, а затем ушелвернуться к обновлению родительских записей o удалить / заменить временные значения.Это нехорошо, но я не нашел лучшего способа.
Insert into EmpBasic
Select cast(ObjectID as varchar(50)) as name, T1Address from EmpFull_Temp
Where ObjectID < 106
Insert into EmpProject
Select A.EmpID, B.T1EmpProject from EmpBasic as A, EmpFull_Temp as B
Where A.Name = cast(B.ObjectID as varchar(50))
Update EmpBasic
Set Name = B.T1Name
from EmpBasic as A, EmpFull_Temp as B
Where A.Name = cast(B.ObjectID as varchar(50))
Обратите внимание: я не тестировал приведенный выше пример SQL, но я надеюсь, что он даст вам представление о том, как вы можете подойти к этому.