[SQLSERVER] Hướng dẫn di chuyển dữ liệu giữa các table (Insert into ... Select ... from)
Bài viết hôm nay, mình sẽ hướng dẫn các bạn cách di chuyển các record qua lại giữa các bảng bằng SQL Server 2016 . Sử dụng T-sql, để sao chép dữ liệu từ bảng này sang bảng khác một cách dễ dàng. INSERT INTO ... SELECT ... FROM Khi cần chuyển ...
Bài viết hôm nay, mình sẽ hướng dẫn các bạn cách di chuyển các record qua lại giữa các bảng bằng SQL Server 2016. Sử dụng T-sql, để sao chép dữ liệu từ bảng này sang bảng khác một cách dễ dàng.
INSERT INTO ... SELECT ... FROM
Khi cần chuyển các bản ghi từ một bảng này sang một bảng khác, bạn có hai cách làm: dùng lệnh INSERT INTO … SELECT FROM…; hoặc dùng SELECT INTO…FROM… Mỗi cách có ưu điểm và nhược điểm riêng, cũng như có phạm vi ứng dụng nhất định. Khi lượng dữ liệu cần di chuyển càng lớn thì sự khác biệt giữa hai cách làm càng rõ.
Cách 1
SELECT Cot1, Cot2, Cot3 INTO Bang2 FROM Bang1
Kết quả của câu lệnh này là bảng Bang2 được tạo ra và chứa các bản ghi của bảng Bang1. Nếu Bang2 đã tồn tại, lệnh sẽ báo lỗi và dừng. Các cột được tạo trong Bang2 sẽ có kiểu dữ liệu copy từ cột tương ứng trong Bang1. Trong trường hợp bạn muốn đổi kiểu dữ liệu, bạn có thể dùng hàm CAST:
SELECT Cot1, Cot2, CAST(Cot3 AS INT) AS Cot3 INTO Bang2 FROM Bang1
Bang2 được tạo ra cũng “trần trụi” – không có khóa chính, index, identity… các cột cũng luôn là cho phép NULL.
Ưu điểm lớn nhất của phương pháp này là nó có tốc độ thực hiện rất nhanh. Nó không phải ghi vào transaction log (và do đó không rollback được) vì thế việc thực thi của nó rất gọn nhẹ. Ở các phiên bản SQL Server cũ (2000 trở về trước), phương pháp này đòi hỏi khóa (lock) vào toàn bộ cấu trúc của database. Vì thế trong thời gian câu lệnh thực thi, các connection khác không thực hiện được các lệnh thay đổi schema (sửa bảng, tạo index…). Điều này đã không còn đúng nữa ở các phiên bản gần đây hơn (hình như từ bản 2000 Service Pack 4). Đây là điều mà khá nhiều người vẫn lầm tưởng và hạn chế sử dụng phương pháp này.
Tuy nhiên phương pháp này đòi hỏi phải tạo bảng mới, nên bạn không thể dùng nếu muốn insert thêm dữ liệu vào bảng đã có sẵn. Đồng thời việc tạo bảng mới cũng làm mất tính ổn định của schema (schema instability). Trong môi trường production đây là nhược điểm lớn nhất, đặc biệt bạn không thể dùng cho các tính năng mà nhiều người cùng sử dụng (ví dụ hai người đồng thời dùng một tính năng ở website dẫn đến câu lệnh này được gọi, lần gọi sau sẽ báo lỗi vì Bang2 đã tồn tại).
Phương pháp này thích hợp với các tác vụ ad hoc hoặc chạy theo batch và không có giao tiếp với người dùng. Khi đó thường dữ liệu cần xử lý với lượng lớn và đây chính là yếu tố mà phương pháp này phát huy hiệu quả.
Cách 2
INSERT INTO Bang2(Cot1, Cot2, Cot3) SELECT Cot1, Cot2, Cot3 FROM Bang1
Đây là cách làm mà có lẽ nhiều người cho là mẫu mực và an toàn. Nó đòi hỏi bảng Bang2 phải tồn tại sẵn và có cấu trúc phù hợp với các trường trong lệnh SELECT. Vì Bang2 cần được tạo từ trước nên khi tạo bảng bạn có thể định nghĩa khóa, index, identity…
Phương pháp này cho phép nhiều người dùng cùng thực hiện, không gây xáo trộn schema, và có thể rollback khi nằm trong 1 transaction do nó dùng transaction log. Vì thế ở các hệ thống giao dịch với người dùng đây là cách bạn nên áp dụng.
Tuy nhiên nhược điểm của phương pháp này là do nó dùng transaction log nên khi áp dụng với lượng dữ liệu lớn nó thực hiện rất chậm.
Theo sqlviet.com