Tôi đã tìm thấy BCP hiệu quả hơn một số công cụ để nhận dữ liệu vào phiên bản SQL Server trước đó và để lấy dữ liệu từ RDS. (Cảm ơn @ivan_posedeev.)
Trước tiên tôi tạo lược đồ bằng cách nhấp chuột phải vào cơ sở dữ liệu trong SQL Server Management Studio, Nhiệm vụ, Tạo tập lệnh. Đánh dấu vào tất cả các đối tượng, trong các đối tượng nâng cao đảm bảo mọi thứ bạn cần sẽ được viết theo kịch bản (số liệu thống kê, chỉ mục, v.v.), bỏ chọn "Cơ sở dữ liệu USE" nếu cơ sở dữ liệu đích của bạn có tên khác, đặt khả năng tương thích với phiên bản cơ sở dữ liệu đích của bạn và tạo tập tin tạo lược đồ của bạn. Tạo một cơ sở dữ liệu về điểm đến của bạn và chạy tập tin này vào nó (sử dụng osql
, sqlcmd
hoặc GUI).
Để di chuyển dữ liệu, hãy chạy truy vấn sau hai lần trên cơ sở dữ liệu nguồn , đầu tiên là nhận xét cột thứ hai để tạo tệp bó để trích xuất dữ liệu, sau đó nhận xét cột đầu tiên để tạo tệp bó nhập để chạy trên đích của bạn. (Bạn cần thêm máy chủ nguồn và đích, tên đối tượng, thư mục tệp đầu ra và đầu vào, tên người dùng và mật khẩu. Để sử dụng bảo mật tích hợp thay thế -U
và -P
các tùy chọn chỉ bằng -T
.)
Điều này hỗ trợ Unicode, nếu bạn không cần điều đó, hãy thay đổi công -N
tắc trong cả hai câu lệnh thành -n
.
SELECT
'bcp SOURCEDATABASE.' + s.Name + '.' + t.NAME + ' out d:\dbdump\' + s.Name + '.' + t.NAME + '.dat -N -S SOURCESERVER\INSTANCE -UUSER -PPASSWORD'
-- 'bcp DESTINATIONDATASE.' + s.Name + '.' + t.NAME + ' in d:\dbdump\' + s.Name + '.' + t.NAME + '.dat -N -S DESTINATIONSERVER\INSTANCE -UUSER -PPASSWORD -E -h TABLOCK -b 1000 -e d:\dbdump\' + s.Name + '.' + t.NAME + '.ERRORS.dat'
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
LEFT OUTER JOIN
sys.schemas s ON t.schema_id = s.schema_id
ORDER BY
s.Name, t.NAME
Sau khi chạy các tệp kiểm tra có tên là lược đồ.tablename.ERRORS.dat - sẽ bao gồm bất kỳ hàng nào bị lỗi, trống nếu không có.
Tham khảo MSDN cho BCP ở đây , thân thiện hơn với các tùy chọn BCP ở đây .
Tôi đã tìm thấy điều này vượt trội hơn nhiều so với việc tạo tập lệnh và bất kỳ công cụ nào tôi đã thử. Nó cũng chạy trên cơ sở dữ liệu RDS (không cho phép sao lưu). Các tệp dữ liệu được tạo có kích thước 30% của các tập lệnh SQL, việc chạy chúng mất một phần thời gian và đáng tin cậy hơn nhiều. (Các kịch bản được tạo ra bởi SQL Server cho dữ liệu kịch bản luôn vấp lên, đôi khi dự đoán đôi khi không, SQL được tạo ra là không tương thích với 2008R2 (ví dụ, sử dụng nvarchar(0)
, thường đã không hoàn thành không có lý do rõ rệt vv BCP cũng tái bản bất kỳ hành vi vi phạm chế , chẳng hạn như tính toàn vẹn tham chiếu.).