Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Einfügen aus einer einzelnen Tabelle in mehrere Tabellen beim Normalisieren der Datenbank

Ich bin nicht wirklich vertraut mit MERGE Daher schlage ich eine alternative Lösung mit zwei INSERT vor Anweisungen:

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

Der erste, INSERT s eindeutige Zeilen von col1,col2 in table1 .

Der zweite führt einen JOIN durch auf tbl und table1 um den FK aus table1 zu bekommen .

Diese beiden INSERT Kontoauszüge dürfen sich nur unter einer Transaktion befinden.

SQL-Fiddle