Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

T-SQL - Вмъкване на данни в родителски и дъщерни таблици

Ето моето решение (въз основа на същия отговор, към който дадох връзка в коментарите):

Първо, трябва да добавите друга колона към вашия UDT, за да запазите временен идентификационен номер на служителя:

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

Попълването му с тази нова колона EmployeeId:

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 вложки.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ISDATE() Примери в SQL Server

  2. Как се наричат ​​тръби?

  3. Типове курсори на SQL Server - Статичен курсор само за препращане | Урок за SQL Server / Урок за TSQL

  4. Архитектура на SQL Server AlwaysOn (група за наличност) и инсталация стъпка по стъпка -1

  5. Как да използвате SQL Server HierarchyID чрез лесни примери