यहाँ मेरा समाधान है (उसी उत्तर के आधार पर जिसे मैंने टिप्पणियों में जोड़ा है):
कर्मचारी के लिए एक अस्थायी आईडी रखने के लिए सबसे पहले, आपको अपने यूडीटी में एक और कॉलम जोड़ना होगा:
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
उस नए कर्मचारी आईडी कॉलम के साथ इसे पॉप्युलेट करना:
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
सम्मिलित करें भाग यहां जाता है
फिर, आप प्रक्रिया में भेजे गए डेटा में कर्मचारी तालिका से सम्मिलित मान को अस्थायी कर्मचारी आईडी में मैप करने के लिए तालिका चर का उपयोग करते हैं:
DECLARE @EmployeeidMap TABLE
(
temp_id int,
id int
)
अब, कर्मचारी तालिका को MERGE
. के साथ भरने की चाल है INSERT...SELECT
. के बजाय स्टेटमेंट क्योंकि आपको आउटपुट क्लॉज में सम्मिलित और स्रोत डेटा दोनों के मूल्यों का उपयोग करना है:
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
उस बिंदु से यह आसान है, आपको @EmployeeidMap
पर भेजे गए डेटा से जुड़ना होगा वास्तविक कर्मचारी आईडी प्राप्त करने के लिए:
INSERT INTO @ParentEmployeeDepartment (EmployeeID, DepartmentType)
SELECT Id, DepartmentType
FROM @tEmployeeData
INNER JOIN @EmployeeidMap ON EmployeeID = temp_id
अब आप डेटा का उपयोग @ParentEmployeeDepartment
. में कर सकते हैं ParentEmployeeDepartmentID
. में वास्तविक मानों को मैप करने के लिए आपके द्वारा भेजे गए डेटा के लिए:
इन्सर्ट का अब तक परीक्षण करना
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
परिणाम:
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
मुझे यकीन है कि इस बिंदु से आप आसानी से अंतिम 2 प्रविष्टियों को स्वयं समझ सकते हैं।