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

Wstawianie z jednej tabeli do wielu tabel podczas normalizacji bazy danych

Nie znam się na MERGE więc proponuję alternatywne rozwiązanie za pomocą dwóch INSERT oświadczenia:

BEGIN TRY
    BEGIN TRANSACTION

    INSERT INTO table1(col1, col2)
        SELECT DISTINCT col1, col2 FROM tbl

    INSERT INTO table2(col3, table1fk)
        SELECT
            t.col3,
            t1.Id
        FROM tbl t
        INNER JOIN table1 t1
            ON t1.col1 = t.col1
            AND t1.col2 = t.col2

    COMMIT TRANSACTION
END TRY

BEGIN CATCH
    IF (@@TRANCOUNT > 0) BEGIN
        ROLLBACK TRANSACTION
    END
    DECLARE
            @ErrorNumber    INT,
            @ErrorMessage   NVARCHAR(4000),
            @ErrorState     INT,
            @ErrorSeverity  INT,
            @ErrorLine      INT

    SELECT
        @ErrorNumber    =   ERROR_NUMBER(),
        @ErrorSeverity  =   ERROR_SEVERITY(),
        @ErrorState     =   ERROR_STATE(),
        @ErrorLine      =   ERROR_LINE(),
        @ErrorMessage   =   ERROR_MESSAGE()

    RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
    PRINT 'Error detected, transaction rolled back.'
END CATCH

Pierwszy, INSERT unikalne wiersze col1,col2 do table1 .

Drugi wykonuje JOIN na tbl i table1 aby pobrać FK z table1 .

Te dwa INSERT wyciągi muszą dotyczyć tylko jednej transakcji.

Skrzypce SQL




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 sposoby na uzyskanie nazwy dnia z daty w SQL Server (T-SQL)

  2. SQL:Audyt zwrotów dla rekordów dla każdej kolumny

  3. Jak zwrócić listę zdarzeń wyzwalających w SQL Server

  4. Jak działa funkcja STR() w SQL Server (T-SQL)

  5. Oblicz różnicę czasu w minutach w SQL Server