2010-11-03 37 views

Trả lời

13

Nếu log IO hệ thống phụ của bạn cho phép nó, sau đó:

INSERT INTO target(field1, field2, field3) 
SELECT field1, field2, field3 FROM source; 

Nhưng có chuyển giao toàn bộ xảy ra trong một tuyên bố duy nhất có nghĩa là một giao dịch duy nhất, có nghĩa là kích thước dữ liệu x2.5 log phải được tạo ra và giữ trong toàn bộ câu lệnh. I E. nếu bạn chuyển 50Gb, nhật ký db mục tiêu của bạn sẽ tăng lên 250Gb (ngay cả khi chế độ khôi phục được đặt thành đơn giản!).

Nếu bạn quan tâm đến nhật ký, thì bạn phải chuyển theo lô. Bạn vẫn có thể thực hiện thủ thuật CH INSN CHỌN ... SELECT, nhưng lệnh SELECT của bạn phải sử dụng một số dãy khóa và số hàng có thể chấp nhận được.

Cuối cùng, bạn luôn có thể thực hiện bcp out, sau đó là bcp in, nó sẽ hoạt động khá nhanh và có lẽ là cách nhanh nhất để chuyển tải đáng tin cậy.

+0

Có bất kỳ sự khác biệt nào với 'INSERT INTO ... SELECT ...' vs 'SELECT ... INTO ...'? Hoặc là sau này chỉ cú pháp đường? Bên cạnh thực tế là bảng không thể tồn tại trong 'SELECT ... INTO ...'. –

+1

'SELECT ... INTO ...' là tốt hơn, nếu có thể. Nó sẽ ghi ít hơn đáng kể nếu cơ sở dữ liệu ở chế độ đăng nhập hàng loạt. IS cũng nhanh hơn bởi vì theo định nghĩa mục tiêu là một heap w/o bất kỳ chỉ số NC, vì vậy nó sẽ là chèn nhanh nhất có thể. Nhưng chỉ có thể được phát hành nếu bảng * không * tồn tại, và OP đã đề cập đến các bảng đã tồn tại. –

14

Nếu databasesare trên cùng một máy chủ, sau đó nó tầm thường - bạn muốn làm điều đó như thể bạn đang sao chép giữa các bảng trong cơ sở dữ liệu tương tự, ví dụ:

INSERT INTO targetdatabase..targettable (col1, col2, col3, col4) 
    SELECT col1, col2, col3, col4 FROM sourcedatabase..sourcetable 

Nếu cơ sở dữ liệu là trên các máy chủ khác nhau, bạn sẽ cần phải xem xét sử dụng một trong OPENQUERY, OPENROWSET hoặc các máy chủ được liên kết để thực hiện truy vấn, nhưng về cơ bản ngay cả với tất cả những điều này, bạn vẫn sẽ viết một biến thể trên lệnh ở trên.

Ngoài ra, đó là trường hợp BCP ra và BCP trong hoặc sử dụng thuật sĩ chuyển dữ liệu của SQL Server Management Studio.

2

Một cách đơn giản là mở SSMS và nhấp chuột phải vào cơ sở dữ liệu và đi đến Tasks> Nhập dữ liệu và làm theo hướng dẫn để thiết lập nguồn và đích.

Bằng cách này, nếu dữ liệu tồn tại trên các hệ thống khác nhau và ngay cả khi bạn muốn thay đổi cấu trúc bạn có thể làm.

Đồng thời thêm hoặc xóa dữ liệu cùng một lúc khỏi đích.

0

chèn vào CRS_New.dbo.SalesUpdateRBCustomerExternalRelationShipData_V1 (RBCustomerExternalEdgeKeyFather, RBCustomerExternalEdgeKeySon, EdgeLevelIndicator, Status, Edition, StatusValidFrom, ActiveIndicator, AddAttributeList_id) chọn RBCustomerExternalEdgeKeyFather, RBCustomerExternalEdgeKeySon, EdgeLevelIndicator, Trạng thái, Phiên bản, Trạng tháiValidFrom, ActiveIndicator, AddAttributeList_id từ CRS.dbo.SalesUpdateRBCustomerExternalRelationShipData_V11

+0

chèn vào DBName.dbo.TableName (col1, col2 ...) chọn (col1, col2 ...) từ DBName.dbo.TableName –

0
Insert into targetdatabase.dbo.tablename 
select * from sourcedatabase.dbo.tablename 

LƯU Ý: .dbo là quan trọng

Nếu các cột khác nhau trong bảng nguồn và đích thì hãy đề cập rõ ràng các cột cho cả hai bảng.Hãy ghi nhớ rằng loại dữ liệu phải giống nhau

+0

downvoted do thiếu danh sách cột –

+1

:) Tôi đã đề cập đến nó giao phối ... nếu các cột của bạn khác nhau về nguồn và đích hơn là bạn cần phải đề cập đến nó, nếu không thì điều này sẽ hoạt động –

+0

Ngay cả khi chúng giống nhau, bạn cần đưa chúng vào. Nếu không, sau đó bạn thêm một cột vào một trong hai nguồn hoặc đích nó sẽ bị hỏng .... thậm chí còn tệ hơn. Lập trình phòng thủ –

Các vấn đề liên quan