Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

T-SQL - Masukkan Data ke dalam Tabel Induk dan Anak

Inilah solusi saya (berdasarkan jawaban yang sama yang saya tautkan di komentar):

Pertama, Anda harus menambahkan kolom lain ke UDT Anda, untuk menyimpan ID sementara untuk karyawan:

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

Mengisinya dengan kolom employeeId baru itu:

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

Sisipkan bagian ada di sini

Kemudian, Anda menggunakan variabel tabel untuk memetakan nilai yang dimasukkan dari tabel karyawan ke id karyawan sementara dalam data yang Anda kirim ke prosedur:

DECLARE @EmployeeidMap TABLE
(
    temp_id int,
    id int
)

Sekarang, triknya adalah mengisi tabel karyawan dengan MERGE pernyataan alih-alih INSERT...SELECT karena Anda harus menggunakan nilai dari data yang dimasukkan dan sumber di klausa keluaran:

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

Sejak saat itu sederhana, Anda harus menggabungkan data yang Anda kirim ke @EmployeeidMap untuk mendapatkan employeeId yang sebenarnya:

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

Sekarang Anda dapat menggunakan data di @ParentEmployeeDepartment untuk memetakan nilai sebenarnya di ParentEmployeeDepartmentID ke data yang Anda kirim:

Menguji sisipan sejauh ini

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

hasil:

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

Saya yakin dari titik ini Anda dapat dengan mudah mengetahui 2 sisipan terakhir sendiri.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ketergantungan SQL Server

  2. Pelajari Desain Database dengan SQL Server Management Studio (SSMS) – Bagian 2

  3. Bagaimana saya bisa menanyakan nilai di kolom SQL Server XML?

  4. Bagaimana saya bisa mengelompokkan berdasarkan kolom tanggal waktu tanpa mempertimbangkan waktu?

  5. Cara Memperbaiki "Fungsi partisi terkait menghasilkan lebih banyak partisi daripada grup file yang disebutkan dalam skema" Msg 7707 di SQL Server