Hier ist meine Lösung (basierend auf derselben Antwort, die ich in den Kommentaren verlinkt habe):
Zunächst müssen Sie Ihrem UDT eine weitere Spalte hinzufügen, um eine temporäre ID für den Mitarbeiter zu speichern:
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
Füllen Sie es mit dieser neuen EmployeeId-Spalte:
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
Teil einfügen gehört hier
Anschließend verwenden Sie eine Tabellenvariable, um den eingefügten Wert aus der Mitarbeitertabelle der temporären Mitarbeiter-ID in den Daten zuzuordnen, die Sie an die Prozedur gesendet haben:
DECLARE @EmployeeidMap TABLE
(
temp_id int,
id int
)
Der Trick besteht nun darin, die Mitarbeitertabelle mit dem MERGE
zu füllen -Anweisung anstelle eines INSERT...SELECT
da Sie in der Ausgabeklausel Werte sowohl aus eingefügten als auch aus Quelldaten verwenden müssen:
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
Von diesem Punkt an ist es einfach, Sie müssen die Daten, die Sie an die @EmployeeidMap
gesendet haben, zusammenführen um die tatsächliche Mitarbeiter-ID zu erhalten:
INSERT INTO @ParentEmployeeDepartment (EmployeeID, DepartmentType)
SELECT Id, DepartmentType
FROM @tEmployeeData
INNER JOIN @EmployeeidMap ON EmployeeID = temp_id
Jetzt können Sie die Daten in @ParentEmployeeDepartment
verwenden um die tatsächlichen Werte in ParentEmployeeDepartmentID
abzubilden an die von Ihnen gesendeten Daten:
Bis jetzt die Einsätze testen
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
Ergebnisse:
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
Ich bin sicher, dass Sie ab diesem Zeitpunkt die letzten 2 Einfügungen leicht selbst herausfinden können.