Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Вмъкване от една таблица в множество таблици при нормализиране на базата данни

Не съм много запознат с MERGE затова предлагам алтернативно решение, използващо два INSERT изявления:

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

Първият, INSERT s уникални редове от col1,col2 в table1 .

Вторият изпълнява JOIN на tbl и table1 за да получите FK от table1 .

Тези два INSERT извлеченията трябва да са само по една транзакция.

SQL Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да включа нулеви стойности в MIN или MAX?

  2. Разбиране на връзката между функциите за класиране, OVER(), GROUP BY?

  3. SQL Server:DELETE срещу TRUNCATE

  4. Задайте начална стойност за колона с автоматично увеличение

  5. Транспонирайте набор от редове като колони в SQL Server 2000