Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Memasukkan Dari Satu Tabel ke beberapa tabel sambil Menormalkan database

Saya tidak terlalu paham dengan MERGE jadi saya mengusulkan solusi alternatif menggunakan dua INSERT pernyataan:

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

Yang pertama, INSERT s baris unik col1,col2 ke dalam table1 .

Yang kedua, melakukan JOIN di tbl dan table1 untuk mendapatkan FK dari table1 .

Kedua INSERT pernyataan harus di bawah satu transaksi saja.

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. 2 Cara Membuat Tabel Jika Tidak Ada di SQL Server

  2. Daftar Semua Kolom Identitas di Database SQL Server:sys.identity_columns

  3. Bagaimana mengatasi sql server 2008 restore error 3203

  4. Cara mengonversi jj:mm:ss ke detik di SQL Server dengan lebih dari 24 jam

  5. Pemotongan SQL Server dan batasan 8192