sql >> Databasteknik >  >> RDS >> Sqlserver

Infoga från en enda tabell i flera tabeller samtidigt som databasen normaliseras

Jag är inte riktigt bekant med MERGE så jag föreslår en alternativ lösning med två INSERT uttalanden:

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örsta, INSERT s unika rader av col1,col2 till table1 .

Den andra utför en JOINtbl och table1 för att hämta FK från table1 .

Dessa två INSERT Utdrag får endast vara under en transaktion.

SQL Fiddle




  1. Använda Percona Audit Log Plugin för databassäkerhet

  2. Visa Oracle-appen och hämta:java.lang.ClassNotFoundException:oracle.forms.engine.Main

  3. Hur väljer man topp 1 och sorteras efter datum i Oracle SQL?

  4. Överträdelse av integritetsbegränsning:1048 Kolumnen "user_id" kan inte vara null fel uppstår vid tilldelning av roller (Laravel 5.3)