sql >> Database >  >> RDS >> Sqlserver

T-SQL - Gegevens in bovenliggende en onderliggende tabellen invoegen

Hier is mijn oplossing (gebaseerd op hetzelfde antwoord waarnaar ik in de opmerkingen heb gelinkt):

Eerst moet u nog een kolom aan uw UDT toevoegen om een ​​tijdelijke ID voor de werknemer vast te houden:

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

Het vullen met die nieuwe kolom werknemer-ID:

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

Invoeggedeelte komt hier

Vervolgens gebruikt u een tabelvariabele om de ingevoegde waarde van de werknemerstabel toe te wijzen aan de tijdelijke werknemer-ID in de gegevens die u naar de procedure hebt verzonden:

DECLARE @EmployeeidMap TABLE
(
    temp_id int,
    id int
)

De truc is nu om de werknemerstabel te vullen met de MERGE statement in plaats van een INSERT...SELECT omdat u waarden van zowel ingevoegde als brongegevens moet gebruiken in de uitvoerclausule:

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

Vanaf dat moment is het eenvoudig, u moet de gegevens die u naar de @EmployeeidMap hebt gestuurd, samenvoegen om de werkelijke werknemer-ID te krijgen:

INSERT INTO @ParentEmployeeDepartment (EmployeeID, DepartmentType)
SELECT Id, DepartmentType
FROM @tEmployeeData 
INNER JOIN @EmployeeidMap ON EmployeeID = temp_id

Nu kunt u de gegevens in @ParentEmployeeDepartment . gebruiken om de werkelijke waarden toe te wijzen in ParentEmployeeDepartmentID naar de gegevens die u hebt verzonden:

Tot nu toe testen van de inserts

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

resultaten:

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

Ik weet zeker dat je vanaf dit punt gemakkelijk zelf de laatste 2 invoegingen kunt achterhalen.




  1. MySQL - Herstel gedropte prestatieschemadatabase

  2. Een tabel maken in MySQL Workbench met behulp van de GUI

  3. Een blob invoegen in een database met behulp van sql server management studio

  4. Detecteren of een waarde ten minste één nummer bevat in SQL Server