Điều này khá dễ thực hiện, nhưng bạn phải theo dõi mọi thứ khi bạn thực hiện. Tôi thường sẽ tạo ra một SP duy nhất cho điều này, đó là một đầu vào bảng câu hỏi để sao chép.
DECLARE @newQuestionnaireId INT
INSERT INTO Questionnaire
(Id,Description)
SELECT Id, Description
FROM Questionnaire
WHERE ID = @sourceQuestionnaireID
SET @newquestionnaireId = SCOPE_IDENTITY()
Tại thời điểm này bạn có bản ghi đầu trang mới và Id mới được tạo cho bản sao. Bước tiếp theo là để tải các loại vào một bảng tạm thời trong đó có một trường bổ sung cho Id
DECLARE @tempCategories TABLE (id INT, description VARCHAR(50),newId INT)
INSERT INTO @tempCategories(id,description)
SELECT id, description FROM Category
WHERE questionnaireId = @sourceQuestionnaireId
mới Bây giờ, bạn có một bảng tạm thời với tất cả các loại để chèn, cùng với một trường để che lấp các mới ID cho danh mục này. Sử dụng con trỏ để đi qua danh sách chèn bản ghi mới và sử dụng cuộc gọi SCOPE_IDENTITY tương tự để chèn lấp Id mới.
DECLARE cuCategory CURSOR FOR SELECT Id, Description FROM @tempCategories
DECLARE @catId INT, @catDescription, @newCatId INT
OPEN cuCategory
FETCH NEXT FROM cuCategory INTO @catId,@catDescription
WHILE @@FETCH_STATUS<>0
BEGIN
INSERT INTO Category(description,questionnaireId)
VALUES(@catDescription,@newQuestionnaireId)
SET @newCatId = SCOPE_IDENTITY()
UPDATE @tempCategories SET [email protected]
WHERE [email protected]
FETCH NEXT FROM cuCategory INTO @catId,@catDescription
END
CLOSE cuCategory
DEALLOCATE cuCategory
Tại thời điểm này, bạn có bảng tạm thời ánh xạ catId từ bảng câu hỏi gốc đến catId cho bảng câu hỏi mới. Điều này có thể được sử dụng để điền vào bảng cuối cùng theo cùng một cách - mà tôi sẽ để lại như là một bài tập cho bạn, nhưng cảm thấy tự do để gửi lại ở đây nếu bạn gặp khó khăn.
Cuối cùng, tôi sẽ đề nghị rằng toàn bộ hoạt động này được thực hiện trong một giao dịch để giúp bạn tiết kiệm từ một nửa bản sao hoàn thành khi xảy ra sự cố.
Một vài tuyên bố từ chối trách nhiệm: Ở trên tất cả đều được nhập nhanh chóng, không mong đợi nó hoạt động tốt. Thứ hai, Ive giả định rằng tất cả các PK của bạn là các trường nhận dạng, mà chúng nên là! Nếu chúng không chỉ thay thế các cuộc gọi SCOPE_IDENTITY() với logic thích hợp để tạo ID tiếp theo.
Edit: documentation for Cursor operations can be foundhere
Tôi thực sự không nhìn thấy vấn đề ở đây ... chỉ cần sao chép các dữ liệu và chèn sử dụng 'SET IDENTITY_INSERT [bảng A] ON' tương tự cho B & C. – Jamiec
Nếu tôi chèn một bản ghi trong bảng A, bản ghi này nhận được một ID, giả sử 104. Hơn nữa, tôi phải chèn một hàng mới trong bảng B, có tham chiếu đến tableA, vì vậy table_A_id phải giống nhau: 104 – Martijn
Không nên một vấn đề miễn là bất cứ nơi nào bạn đang sao chép là trống, vì dữ liệu mới sẽ có cùng một PK bằng cách sử dụng IDENTITY_INSERT. Bạn đang cố sao chép vào đâu? Một cơ sở dữ liệu giống hệt nhau có lẽ? – Jamiec