Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

T-SQL — wstawiaj dane do tabel nadrzędnych i podrzędnych

Oto moje rozwiązanie (na podstawie tej samej odpowiedzi, do której podałem link w komentarzach):

Najpierw musisz dodać kolejną kolumnę do swojego UDT, aby przechowywać tymczasowy identyfikator pracownika:

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

Wypełnij go nową kolumną identyfikator pracownika:

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

Tutaj wstawiaj część

Następnie używasz zmiennej tabeli, aby zmapować wstawioną wartość z tabeli pracowników na identyfikator pracownika tymczasowego w danych przesłanych do procedury:

DECLARE @EmployeeidMap TABLE
(
    temp_id int,
    id int
)

Teraz sztuczka polega na zapełnieniu tabeli pracowników za pomocą MERGE instrukcja zamiast INSERT...SELECT ponieważ musisz użyć wartości z danych wstawionych i źródłowych w klauzuli wyjściowej:

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

Od tego momentu wszystko jest proste, musisz połączyć dane, które wysłałeś do @EmployeeidMap aby uzyskać rzeczywisty identyfikator pracownika:

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

Teraz możesz korzystać z danych w @ParentEmployeeDepartment do mapowania rzeczywistych wartości w ParentEmployeeDepartmentID do przesłanych danych:

Do tej pory testowałem wkładki

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

wyniki:

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

Jestem pewien, że od tego momentu możesz łatwo wymyślić ostatnie 2 wstawki.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL, jak łączyć wyniki?

  2. Co to jest @@TEXTSIZE w programie SQL Server?

  3. Jak mogę wywołać procedurę składowaną SQL przy użyciu EntityFramework 7 i Asp.Net 5?

  4. Przywróć bazę danych w SQL Server 2017

  5. Podział ciągu T-SQL