sql >> Database teknologi >  >> RDS >> Sqlserver

Indsættelse fra en enkelt tabel i flere tabeller, mens databasen normaliseres

Jeg er ikke rigtig bekendt med MERGE så jeg foreslår en alternativ løsning med to INSERT udsagn:

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

Den første, INSERT s unikke rækker af col1,col2 ind i table1 .

Den anden udfører en JOINtbl og table1 for at hente FK'en fra table1 .

Disse to INSERT opgørelser må kun være under én transaktion.

SQL Fiddle




  1. Inkluder, vælg, sorter, begræns fra flere modeller (enkelt forespørgsel)

  2. MYSQL - Sorter efter id i DESC rækkefølge, gruppe efter X

  3. Sådan flyttes data mellem 2 tabeller / med forskellige kolonner i forskellige databaser

  4. find antallet af rækker i returneret mysql-resultat (nodejs)