Đây là giải pháp của tôi (dựa trên cùng một câu trả lời mà tôi đã liên kết trong các nhận xét):
Trước tiên, bạn phải thêm một cột khác vào UDT của mình, để giữ ID tạm thời cho nhân viên:
CREATE TYPE dbo.tEmployeeData AS TABLE
(
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
DepartmentType NVARCHAR(10),
DepartmentBuilding NVARCHAR(50),
DepartmentEmployeeLevel NVARCHAR(10),
DepartmentTypeAMetadata NVARCHAR(100),
DepartmentTypeBMetadata NVARCHAR(100),
EmployeeId int
)
GO
Đưa nó vào cột nhân viên mới đó:
DECLARE @tEmployeeData tEmployeeData
INSERT INTO @tEmployeeData (FirstName, LastName, DepartmentType,
DepartmentBuilding, DepartmentEmployeeLevel,
DepartmentTypeAMetadata, DepartmentTypeBMetadata, EmployeeId)
SELECT
N'Tom_FN', N'Tom_LN', N'A',
N'101', N'IV', N'Tech/IT', NULL, 5
UNION
SELECT
N'Mike_FN', N'Mike_LN', N'B',
N'OpenH', N'XII', NULL, N'Med', 6
UNION
SELECT
N'Joe_FN', N'Joe_LN', N'A',
N'101', N'IV', N'Tech/IT', NULL, 7
UNION
SELECT
N'Dave_FN', N'Dave_LN', N'B',
N'OpenC', N'XII', NULL, N'Lab', 8
Chèn một phần ở đây
Sau đó, bạn sử dụng một biến bảng để ánh xạ giá trị được chèn từ bảng nhân viên sang id nhân viên tạm thời trong dữ liệu bạn đã gửi đến thủ tục:
DECLARE @EmployeeidMap TABLE
(
temp_id int,
id int
)
Bây giờ, mẹo là điền vào bảng nhân viên bằng MERGE
câu lệnh thay vì INSERT...SELECT
vì bạn phải sử dụng các giá trị từ cả dữ liệu được chèn và dữ liệu nguồn trong mệnh đề đầu ra:
MERGE INTO @MainEmployee USING @tEmployeeData AS sourceData ON 1 = 0 -- Always not matched
WHEN NOT MATCHED THEN
INSERT (FirstName, LastName)
VALUES (sourceData.FirstName, sourceData.LastName)
OUTPUT sourceData.EmployeeId, inserted.EmployeeID
INTO @EmployeeidMap (temp_id, id); -- populate the map table
Từ đó, thật đơn giản, bạn cần kết hợp dữ liệu bạn đã gửi đến @EmployeeidMap
để có được nhân viên thực tếId:
INSERT INTO @ParentEmployeeDepartment (EmployeeID, DepartmentType)
SELECT Id, DepartmentType
FROM @tEmployeeData
INNER JOIN @EmployeeidMap ON EmployeeID = temp_id
Giờ đây, bạn có thể sử dụng dữ liệu trong @ParentEmployeeDepartment
để ánh xạ các giá trị thực tế trong ParentEmployeeDepartmentID
vào dữ liệu bạn đã gửi:
Kiểm tra các phụ trang cho đến nay
SELECT FirstName,
LastName,
SentData.DepartmentType As [Dept. Type],
DepartmentBuilding As Building,
DepartmentEmployeeLevel As [Emp. Level],
DepartmentTypeAMetadata As [A Meta],
DepartmentTypeBMetadata As [B Meta],
SentData.EmployeeId As TempId, EmpMap.id As [Emp. Id], DeptMap.ParentEmployeeDepartmentID As [Dept. Id]
FROM @tEmployeeData SentData
INNER JOIN @EmployeeidMap EmpMap ON SentData.EmployeeId = temp_id
INNER JOIN @ParentEmployeeDepartment DeptMap ON EmpMap.id = DeptMap.EmployeeID
kết quả:
FirstName LastName Dept. Type Building Emp. Level A Meta B Meta TempId Emp. Id Dept. Id
--------- -------- ---------- -------- ---------- ------ ------ ------ ----------- -----------
Dave_FN Dave_LN B OpenC XII NULL Lab 8 1 1
Joe_FN Joe_LN A 101 IV Tech/IT NULL 7 2 2
Mike_FN Mike_LN B OpenH XII NULL Med 6 3 3
Tom_FN Tom_LN A 101 IV Tech/IT NULL 5 4 4
Tôi chắc rằng từ thời điểm này, bạn có thể dễ dàng tự mình tìm ra 2 lần chèn cuối cùng.