Sao chép bảng từ cơ sở dữ liệu này sang cơ sở dữ liệu khác trong SQL Server


324

Tôi có một cơ sở dữ liệu gọi là foo và cơ sở dữ liệu gọi là thanh. Tôi có một bảng trong foo gọi là tblFoobar mà tôi muốn di chuyển (dữ liệu và tất cả) sang thanh cơ sở dữ liệu từ cơ sở dữ liệu foo. Câu lệnh SQL để làm điều này là gì?

Câu trả lời:


208

Trên máy chủ SQL? và trên cùng một máy chủ cơ sở dữ liệu? Sử dụng ba phần đặt tên.

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

Điều này chỉ di chuyển dữ liệu. Nếu bạn muốn di chuyển định nghĩa bảng (và các thuộc tính khác như quyền và chỉ mục), bạn sẽ phải làm một cái gì đó khác.


Bạn cũng sẽ phải đặt riêng quyền cho bảng, tôi tin.
Ken Ray

1
Nếu bạn cũng cần thực hiện chèn nhận dạng, Trình hướng dẫn Nhập dữ liệu có một tùy chọn cho điều đó ^^ - tham khảo câu trả lời khác
Clarence Liu

13
@TahaRehmanSiddiqui: Bởi vì nó trả lời câu hỏi;) Anh ấy không hỏi làm thế nào để sao chép nó giữa các máy chủ cơ sở dữ liệu. Nhưng hầu hết mọi người tìm kiếm câu trả lời đó đều kết thúc ở đây, bởi vì google cho kết quả đầu tiên :)
Maarten Kieft

1
@RyanB có, điều đó được cho phép.
Amy B

1
@Tom OP và nhiều người đến với câu hỏi này đang tìm kiếm một "câu lệnh SQL", không phải là một công cụ.
Amy B

535

Tác vụ "Nhập dữ liệu" của SQL Server Management Studio (nhấp chuột phải vào tên DB, sau đó các tác vụ) sẽ thực hiện hầu hết việc này cho bạn. Chạy nó từ cơ sở dữ liệu bạn muốn sao chép dữ liệu vào.

Nếu các bảng không tồn tại, nó sẽ tạo chúng cho bạn, nhưng có lẽ bạn sẽ phải tạo lại bất kỳ chỉ mục nào và như vậy. Nếu các bảng tồn tại, nó sẽ nối thêm dữ liệu mới theo mặc định nhưng bạn có thể điều chỉnh (chỉnh sửa ánh xạ) để nó sẽ xóa tất cả dữ liệu hiện có.

Tôi sử dụng tất cả thời gian và nó hoạt động khá tốt.


1
tôi dường như không thể tìm thấy tùy chọn này. Có một phiên bản cụ thể ở đây?
Nerrve

35
Bạn thực sự không thể nói đó là một câu trả lời tốt hơn nói chung. Chẳng hạn, tự động hóa được gọi từ trong tập lệnh. BTW tác giả đã yêu cầu cụ thể cho một "câu lệnh .. vấn đề ..". Nhưng tất nhiên đó là một câu trả lời tuyệt vời, nhưng không phải là một câu trả lời tốt hơn;).
Grizzly

3
Tác giả yêu cầu di chuyển "(dữ liệu và tất cả)"; Vì vậy, tôi hy vọng rằng câu trả lời này đã làm điều đó. Nó tạo bảng nhưng không tạo bất kỳ khóa hoặc chỉ mục nào; vì vậy không có nhiều cải tiến so với câu trả lời SQL.
hủy

Có thể chỉ định một WHEREđiều kiện bằng cách sử dụng tác vụ Nhập dữ liệu? Tôi đã không thể tìm ra cách để làm như vậy.
nghiền nát

1
vâng đây là cách chính xác như đã đề cập ở đây cũng vậy, nhưng identityforeign keytài liệu tham khảo được loại bỏ trong cơ sở dữ liệu đích, bất kỳ giải pháp?
shaijut

106

Điều này sẽ làm việc:

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

Nó sẽ không sao chép các chòm sao, mặc định hoặc chỉ mục. Bảng được tạo sẽ không có một chỉ mục cụm.

Ngoài ra, bạn có thể:

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

Nếu bảng đích của bạn tồn tại và trống.


Có vấn đề gì không nếu trước tiên bạn sao chép cấu trúc bảng cơ sở (trường và dữ liệu) và sau đó áp dụng tập lệnh để tạo quyền, chỉ mục, ràng buộc và thuộc tính mở rộng?
leoinfo

4
Điều này sẽ không chèn giá trị cho các cột danh tính trong SQL Server 2008. Điều đó chỉ được phép khi bạn sử dụng danh sách cột và IDENTITY_INSERT được BẬT cho bảng đích.
Lucas Wilson-Richter

@Lucas - Bạn đúng "một nửa" :). Tuy nhiên, câu lệnh SQL đầu tiên sao chép TẤT CẢ dữ liệu, bao gồm các giá trị trong các cột định danh. Như tôi đã nói, các ràng buộc không được tạo ra. Nhưng chúng có thể dễ dàng được viết kịch bản trên DB nguồn và được áp dụng cho DB đích sau khi tất cả dữ liệu được di chuyển.
leoinfo

Phiên bản thứ hai ( INSERT INTO...) làm việc cho tôi trong Oracle.
vapcguy

Điều này có hoạt động không nếu 2 cơ sở dữ liệu nằm trên các máy chủ hoàn toàn khác nhau với các chuỗi kết nối khác nhau? Nếu không làm thế nào để bạn xử lý đó?
Alexander Ryan Baggett

46

Nếu chỉ có một bảng thì tất cả những gì bạn cần làm là

  • Định nghĩa bảng script
  • Tạo bảng mới trong cơ sở dữ liệu khác
  • Cập nhật quy tắc, chỉ mục, quyền và như vậy
  • Nhập dữ liệu (một số chèn vào các ví dụ đã được hiển thị ở trên)

Một điều bạn sẽ phải xem xét là các bản cập nhật khác như di chuyển các đối tượng khác trong tương lai. Lưu ý rằng bảng nguồn và đích của bạn không có cùng tên. Điều này có nghĩa là bạn cũng sẽ phải thay đổi nếu bạn phụ thuộc vào các đối tượng như chế độ xem, quy trình được lưu trữ và các đối tượng khác.

Whit một hoặc một số đối tượng bạn có thể đi bằng tay với bất kỳ vấn đề. Tuy nhiên, khi có nhiều hơn một vài cập nhật, các công cụ so sánh của bên thứ 3 trở nên rất tiện dụng. Ngay bây giờ tôi đang sử dụng ApexQuery Diff để di chuyển lược đồ nhưng bạn không thể sai với bất kỳ công cụ nào khác ngoài đó.


23
  1. Tập lệnh create tabletrong studio quản lý, chạy tập lệnh đó trong thanh để tạo bảng. (Bảng nhấp chuột phải trong trình thám hiểm đối tượng, bảng kịch bản dưới dạng, tạo thành ...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table


1
Tôi thích cách tiếp cận này. Chọn * sẽ không hoạt động nếu có một cột danh tính, bạn sẽ cần liệt kê rõ ràng các tên cột. Bạn cũng sẽ cần phải làm SET IDENTITY_INSERT TblName ONtrong trường hợp đó.
Jeremy Weir

16

Bạn cũng có thể sử dụng Trình hướng dẫn tạo tập lệnh SQL Server để giúp hướng dẫn việc tạo tập lệnh SQL có thể thực hiện như sau:

  • sao chép lược đồ bảng
  • bất kỳ ràng buộc nào (danh tính, giá trị mặc định, v.v.)
  • dữ liệu trong bảng
  • và nhiều lựa chọn khác nếu cần

Ví dụ về quy trình làm việc tốt cho SQL Server 2008 với ảnh chụp màn hình được hiển thị ở đây .


Xem bình luận của tôi trên:?!? "Làm sao này có được 508/171 phiếu bầu và của Ryan 'ngày 11 tháng 10 '11 23:41' trả lời chỉ có được 13 đến ngày Ryan là chỉ trả lời câu trả lời đó là q của op. Hoàn toàn . Bởi vì nó xử lý các kịch bản này (trong đó, btw, OP KHÔNG loại trừ khỏi q.): a) Danh tính ( rất phổ biến), b) Ràng buộc, c) Kích hoạt, d) Chỉ mục, e) Quyền, d) sao chép Lược đồ VÀ Dữ liệu ( Gợi ý: phần "và tất cả" của op "(dữ liệu và tất cả)" cũng ngụ ý Schema.) Và e) tạo ra "câu lệnh SQL" mà op đã chỉ định mà ngay cả khi anh ta không có nghĩa là tốt hơn là có Hơn không.".
Tom

1
Lưu ý: Câu trả lời này chỉ thực tế khi # của Hàng không "quá mức" (tức là tra cứu / Bảng giao dịch nhỏ) và không có giá trị Cột "lớn". Đối với những người đó, tôi sẽ sử dụng Câu trả lời của Ryan chỉ để tạo Tập lệnh cho Bảng (bao gồm Thuộc tính Cột và Đối tượng phụ), sau đó sử dụng Câu trả lời "Chèn vào Chọn" của David B. Đối với các Bảng đơn (thay vì A của Ryan), bạn cũng có thể sử dụng SSMS, Object Explorer, Bảng nhấp chuột phải, Bảng Script như, TẠO, nhưng bạn phải đảm bảo Công cụ, Tùy chọn, SQL Server Object Explorer, tùy chọn Script thiết lập như mong muốn.
Tom

9

Bạn có thể đi theo cách này: (một ví dụ chung)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

Ngoài ra nếu bạn cũng cần tạo các tên cột để đặt trong mệnh đề chèn, hãy sử dụng:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

Sao chép kết quả và dán vào cửa sổ truy vấn để thể hiện tên cột trong bảng của bạn và thậm chí điều này cũng sẽ loại trừ cột nhận dạng:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

Hãy nhớ tập lệnh để sao chép các hàng sẽ hoạt động nếu cơ sở dữ liệu thuộc cùng một vị trí.


Bạn có thể thử cái này

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

Tên máy chủ là tùy chọn nếu cả hai DB nằm trong cùng một máy chủ.


1

Nếu có bảng hiện có và chúng tôi chỉ muốn sao chép dữ liệu, chúng tôi có thể thử truy vấn này.

chèn vào Destination_Ex hiện_Tbl chọn col1, col2 TỪ Source_Tbl


0

Sao chép dữ liệu

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
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.