sql >> データベース >  >> RDS >> Sqlserver

T-SQL-親テーブルと子テーブルにデータを挿入します

    これが私の解決策です(コメントでリンクしたのと同じ答えに基づいています):

    まず、従業員の一時IDを保持するために、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
    

    挿入部分はここにあります

    次に、テーブル変数を使用して、従業員テーブルから挿入された値を、プロシージャに送信したデータの臨時従業員IDにマップします。

    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に送ったデータを結合する必要があります 実際のemployeeIdを取得するには:

    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. SpringBootテスト用のEmbeddedPostgres

    2. Oracleを使用したAWSPythonLambda

    3. ロックの総数がロックテーブルのサイズを超えています

    4. VDP AdvancedSQLAgentを使用したSQLデータベースのバックアップ