SQL Server - Tạo một bản sao của bảng cơ sở dữ liệu và đặt nó trong cùng một cơ sở dữ liệu?


108

Tôi có một bảng ABC trong cơ sở dữ liệu DB. Tôi muốn tạo các bản sao của ABC với các tên ABC_1, ABC_2, ABC_3 trong cùng một DB. Làm cách nào tôi có thể làm điều đó bằng cách sử dụng Management Studio (tốt nhất là) hoặc truy vấn SQL?

Đây là dành cho SQL Server 2008 R2.


1
một bài đăng khác không liên quan trực tiếp nhưng có thể liên quan đến trường hợp sử dụng ở trên - stackoverflow.com/questions/6810425/…, điều này có thể hữu ích khi bạn muốn chỉnh sửa các bản sao của bảng (ví dụ: cho phép null, thay đổi kiểu dữ liệu, v.v. .) mà không cần phải tạo lại các bản sao.
theo.learner

Câu trả lời:


212

Sử dụng SELECT ... INTO:

SELECT *
INTO ABC_1
FROM ABC;

Thao tác này sẽ tạo một bảng mới ABC_1có cùng cấu trúc cột ABCvà chứa cùng dữ liệu. Tuy nhiên, các ràng buộc (ví dụ: khóa, giá trị mặc định) không được sao chép.

Bạn có thể chạy truy vấn này nhiều lần với một tên bảng khác nhau mỗi lần.


Nếu bạn không cần sao chép dữ liệu, chỉ để tạo một bảng trống mới có cùng cấu trúc cột, hãy thêm WHEREmệnh đề có biểu thức sai:

SELECT *
INTO ABC_1
FROM ABC
WHERE 1 <> 1;

3
Câu trả lời hoàn hảo cho vấn đề của tôi.
theo.learner

8
Không hoạt động hoàn toàn .... các cột được tính toán trong bản gốc không được sao chép giống như trong mục tiêu. Ngoài ra, các ràng buộc PK và Mặc định cũng không được sao chép
Simon Green

@SimonGreen - Bạn có thể đăng câu hỏi mới cho vấn đề này với mã của mình.
Mahmoud Gamal

3
Tất nhiên nó không hoạt động hoàn toàn. Ông cảnh báo rằng các ràng buộc không được sao chép, khóa chính hoặc giá trị mặc định cũng không. Lệnh anh ta đưa ra sẽ tạo một bảng mới với cấu trúc cột tương tự (giống như anh ta đã nói) và chèn tất cả dữ liệu vào bảng mới cho bạn.
user5855178

1
Tôi tìm thấy sử dụng SELECT TOP(0) *sạch hơn luôn sai WHEREphương pháp tuyên bố
thymine

21

Sao chép giản đồ (Tạo DDL) thông qua giao diện người dùng SSMS

Trong SSMS, hãy mở rộng cơ sở dữ liệu của bạn trong Object Explorer , đi tới Tables , nhấp chuột phải vào bảng mà bạn quan tâm và chọn Script Table As , Create To , New Query Editor Window . Thực hiện tìm và thay thế ( CTRL + H ) để thay đổi tên bảng (nghĩa là đặt ABCtrong trường Tìm gìABC_1trong trường Thay thế Bằng rồi bấm OK ).

Sao chép lược đồ thông qua T-SQL

Các câu trả lời khác chỉ ra cách thực hiện điều này bằng SQL cũng hoạt động tốt, nhưng sự khác biệt với phương pháp này là bạn cũng sẽ nhận được bất kỳ chỉ mục, ràng buộc và trình kích hoạt nào.

Sao chép dữ liệu

Nếu bạn muốn bao gồm dữ liệu, sau khi tạo bảng này, hãy chạy tập lệnh bên dưới để sao chép tất cả dữ liệu từ ABC (giữ nguyên các giá trị ID nếu bạn có trường nhận dạng):

set identity_insert ABC_1 on
insert into ABC_1 (column1, column2) select column1, column2 from ABC
set identity_insert ABC_1 off

1
Bạn có chắc là phương pháp này cũng sao chép các chỉ số không? Tôi đã thử nó và nó không.
BornToCode

3
Bạn phải đặt IDENTITY_INSERTthành BẬT để cho phép đặt cột nhận dạng "theo cách thủ công", bạn đã trộn thứ tự trong ví dụ của mình. Ngoài ra, bạn phải EXPLICIT liệt kê các cột của mình
jean

2
Cảm ơn @jean; cũng phát hiện sau 6 năm không được chú ý! Đã sửa.
JohnLBevan

Điều này gần như đã giải quyết được vấn đề cho tôi. Mẹo cuối cùng là bạn có thể kéo thư mục "Cột" trong cây trong SSMS vào trình chỉnh sửa để có được danh sách các cột. Tôi có một cột dấu thời gian trên mỗi bảng, vì vậy tôi phải lấy danh sách các cột và sau đó xóa dấu thời gian.
Wade Hatler

10

Nếu bạn muốn sao chép bảng với tất cả các ràng buộc và khóa của nó, hãy làm theo các bước sau:

  1. Mở cơ sở dữ liệu trong SQL Management Studio.
  2. Bấm chuột phải vào bảng mà bạn muốn sao chép.
  3. Chọn Bảng tập lệnh làm -> Tạo thành -> Cửa sổ trình soạn thảo truy vấn mới. Thao tác này sẽ tạo một tập lệnh để tạo lại bảng trong một cửa sổ truy vấn mới.
  4. Thay đổi tên bảng và các khóa & ràng buộc tương đối trong tập lệnh.
  5. Thực thi script.

Sau đó, để sao chép dữ liệu, hãy chạy tập lệnh dưới đây:

SET IDENTITY_INSERT DuplicateTable ON

INSERT Into DuplicateTable ([Column1], [Column2], [Column3], [Column4],... ) 
SELECT [Column1], [Column2], [Column3], [Column4],... FROM MainTable

SET IDENTITY_INSERT DuplicateTable OFF

4

Lựa chọn đầu tiên

select *
  into ABC_1
  from ABC;

Tùy chọn thứ 2: sử dụng SSIS, đó là nhấp chuột phải vào cơ sở dữ liệu trong trình khám phá đối tượng> tất cả các tác vụ> xuất dữ liệu

  • nguồn và đích: DB của bạn
  • bảng nguồn: ABC
  • bảng mục tiêu: ABC_1 (bảng sẽ được tạo)

2

Đây là một tùy chọn khác:

select top 0 * into <new_table> from <original_table>

2
Yêu cầu này sao chép bảng mà không có dữ liệu. Người dùng yêu cầu sao chép bảng ở tất cả.
Alekzander

1

sử dụng studio quản lý máy chủ sql hoặc netcat và điều đó sẽ dễ dàng hơn để thao tác sql


1

Bạn cần viết SSIS để sao chép bảng và dữ liệu, ràng buộc và trình kích hoạt của bảng. Trong tổ chức của mình, chúng tôi có một phần mềm tên là Kal Admin của kalrom Systems có phiên bản miễn phí để tải xuống (tôi nghĩ rằng tính năng sao chép bảng là tùy chọn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.