Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chèn Từ một Bảng vào nhiều bảng trong khi Chuẩn hóa cơ sở dữ liệu

Tôi không thực sự quen thuộc với MERGE vì vậy tôi đang đề xuất một giải pháp thay thế bằng cách sử dụng hai INSERT tuyên bố:

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

Cái đầu tiên, INSERT s hàng duy nhất của col1,col2 vào table1 .

Cái thứ hai, thực hiện JOIN trên tbltable1 để lấy FK từ table1 .

Hai INSERT này sao kê chỉ được dưới một giao dịch.

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. Chuyển đổi ‘smalldatetime’ thành ‘datetime2’ trong SQL Server (Ví dụ T-SQL)

  2. Try_Convert dành cho SQL Server 2008 R2

  3. Lược đồ cơ sở dữ liệu, tự động tăng

  4. Làm thế nào chúng ta có thể sử dụng ISNULL cho tất cả các tên cột trong SQL Server 2008?

  5. Tạo bảng bằng cách sử dụng câu lệnh tạo bảng rõ ràng so với chọn vào