sql >> Databáze >  >> RDS >> Sqlserver

Vkládání z jedné tabulky do více tabulek při normalizaci databáze

MERGE moc neznám takže navrhuji alternativní řešení pomocí dvou INSERT prohlášení:

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

První, INSERT s jedinečnými řádky col1,col2 do table1 .

Druhý provede JOIN na tbl a table1 získat FK z table1 .

Tyto dva INSERT výpisy musí být v rámci jedné transakce.

SQL Fiddle




  1. PL/SQL:přepište příkaz SELECT pomocí parametru IN v uložené proceduře

  2. Získejte ConnectionString z app.config v c#

  3. Oracle jak exportovat dotaz do textového/csv souboru

  4. Take a Group By v EntityFramework