Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

sao chép giữa hai bảng có tên khác nhau và có tên cột khác nhau. Có thể tạo ra bản sao như vậy không

Rõ ràng, câu trả lời là:"Khi bạn xác định bài viết, bạn sẽ phải đặt @vertical_partition tham số thành true và sau đó thêm các cột bạn muốn với sp_articlecolumn . "

Tuy nhiên, tôi phải hỏi tại sao bạn lại làm điều này. Sao chép trong suy nghĩ của tôi không phải là một công cụ chung để di chuyển dữ liệu giữa các cơ sở dữ liệu không giống nhau mà để giữ đồng bộ hai cơ sở dữ liệu giống hệt nhau.

Các ý tưởng động não khác:

  • Bạn có thể tạo một bảng nguồn mới khớp với bảng đích và sử dụng trình kích hoạt để giữ cho bảng nguồn được đồng bộ hóa.
  • Đẩy nguyên bảng nguồn đến đích và thực hiện MERGE trong cơ sở dữ liệu đích.
  • Tại đây, sao chép có thể không thực sự là giải pháp phù hợp. Các quy tắc và yêu cầu kinh doanh đang kêu gọi thực hiện điều này là gì? Bạn đã cân nhắc sử dụng SSIS chưa?
  • Nếu luôn cần hai bảng đồng bộ hóa chính xác, thì kênh thay đổi đối với bảng nguồn - một ứng dụng là gì? Có vẻ như ứng dụng của bạn cần một cấp độ trừu tượng mới, một lớp ghi dữ liệu biết cách ghi vào hai nguồn cùng một lúc.

Cố gắng giữ cho dữ liệu được đồng bộ hóa giữa hai cơ sở dữ liệu khác nhau có thể là một vấn đề. Có thể có tất cả các loại vấn đề phức tạp với điều kiện chủng tộc, thiếu giao dịch phân tán (ảnh hưởng đến tính nhất quán và phản ứng với thất bại), các vấn đề với cách giải quyết được tạo ra để đối phó với việc không có giao dịch phân tán, v.v. Thay vào đó, bạn có thể tạo một máy chủ được liên kết và một số dạng xem thực sự làm cho dữ liệu trong một cơ sở dữ liệu được truy cập theo thời gian thực từ cơ sở dữ liệu kia không?

Vui lòng cho chúng tôi biết thêm về yêu cầu của bạn và lý do bạn cần thực hiện việc này.

Cập nhật

Nếu bạn đang sử dụng lộ trình cập nhật thủ công, hãy lưu ý rằng bạn không thể áp dụng các thao tác chèn, cập nhật và xóa của một khoảng thời gian. Bạn phải áp dụng từng cái một, theo thứ tự . Nếu thay vào đó bạn đang làm việc với trạng thái hiện tại chứ không phải là các hoạt động dữ liệu trung gian, sau đó bạn có thể thực hiện tất cả các hàng cùng một lúc. Tôi sẽ cho bạn xem ví dụ MERGE, không phải ví dụ lịch sử phát lại.

BEGIN TRAN;

DELETE D
FROM LinkedServer.dbo.Dest D WITH (TABLOCKX, HOLDLOCK)
WHERE
   NOT EXISTS (
      SELECT *
      FROM Source S
      WHERE D.Key = S.Key
   );

UPDATE D
SET
   D.Col1 = S.Col4,
   D.Col2 = S.Col5,
   D.Col3 = S.Col6,
   D.Col4 = S.Col7,
FROM
   LinkedServer.dbo.Dest D
   INNER JOIN Source S ON D.Key = S.Key
WHERE
   D.Col1 <> S.Col4
   OR EXISTS (
      SELECT D.Col2, D.Col4
      EXCEPT
      SELECT S.Col3, S.Col6
   ); -- or some other way to handle comparison of nullable columns

INSERT LinkedServer.dbo.Dest (Col1, Col2, Col3)
SELECT Col4, Col5, Col6
FROM Source S WITH (TABLOCK, HOLDLOCK)
WHERE
   NOT EXISTS (
      SELECT *
      FROM LinkedServer.dbo.Dest D
      WHERE S.Key = D.Key
   );

COMMIT TRAN;

Bạn có thể thấy tốt hơn nếu đẩy toàn bộ bảng và thực hiện thao tác hợp nhất trên máy chủ đích.

Các gợi ý về khóa mà tôi đưa ra trong truy vấn đầu tiên rất quan trọng nếu bạn muốn có một ảnh chụp nhanh theo thời điểm nhất quán. Nếu bạn không quan tâm đến điều đó, hãy xem các gợi ý khóa.

Nếu bạn thấy rằng các bản cập nhật trên máy chủ được liên kết chậm, hãy đẩy toàn bộ bảng thành một bảng sang một bảng tạm thời trên máy chủ từ xa và thực hiện MERGE trong một tập lệnh hoàn toàn trên máy chủ từ xa.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tham chiếu con trỏ máy chủ SQL (Cú pháp, v.v.)

  2. Truy vấn phân cấp trong SQL Server 2005

  3. Đổi tên nhiều bảng

  4. Xóa tiêu đề cột khỏi kết quả truy vấn SQL Server

  5. Nội bộ sao chép giao dịch SQL Server