Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

T-SQL - Chèn dữ liệu vào Bảng cha và Bảng con

Đâ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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trả lại Tên máy trạm hiện tại được kết nối với SQL Server (T-SQL)

  2. Thói quen xấu:Tránh NULL trong SQL Server

  3. CAST () so với TRY_CAST () trong SQL Server:Sự khác biệt là gì?

  4. Tự động hóa việc truy xuất số phiên bản từ tệp .Dtsx

  5. Tại sao việc sử dụng ký tự Dấu gạch dưới trong bộ lọc LIKE lại cho tôi tất cả kết quả?