यह पूरा करने में बहुत आसान है, लेकिन आपको जितना भी जाना है, उसे ट्रैक रखना होगा। मैं आम तौर पर इसके लिए एक एकल एसपी बनाउंगा, जो कॉपी करने के लिए प्रश्नावली इनपुट के रूप में लेता है।
DECLARE @newQuestionnaireId INT
INSERT INTO Questionnaire
(Id,Description)
SELECT Id, Description
FROM Questionnaire
WHERE ID = @sourceQuestionnaireID
SET @newquestionnaireId = SCOPE_IDENTITY()
इस बिंदु पर आपके पास एक नया हेडर रिकॉर्ड है, और प्रतिलिपि के लिए नव निर्मित आईडी है। अगले कदम के लिए जो नई आईडी
DECLARE @tempCategories TABLE (id INT, description VARCHAR(50),newId INT)
INSERT INTO @tempCategories(id,description)
SELECT id, description FROM Category
WHERE questionnaireId = @sourceQuestionnaireId
के लिए एक अतिरिक्त क्षेत्र अब है, तो आपको सभी श्रेणियों के साथ एक अस्थायी तालिका सम्मिलित करने के लिए है, एक क्षेत्र नई बैकफ़िल करने के साथ साथ एक अस्थायी तालिका में श्रेणियां लोड करने के लिए है इस श्रेणी के लिए आईडी। नए रिकॉर्ड को सम्मिलित करने वाली सूची में जाने के लिए कर्सर का उपयोग करें, और नए आईडी को बैकफिल करने के लिए समान SCOPE_IDENTITY कॉल का उपयोग करें।
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
इस बिंदु पर आप अब एक अस्थायी तालिका जो नई प्रश्नावली के लिए CatID करने के लिए मूल प्रश्नावली से CatID नक्शे की है। इसका उपयोग अंतिम तालिका को उसी तरह भरने के लिए किया जा सकता है - जो मैं आपके लिए एक व्यायाम के रूप में छोड़ दूंगा, लेकिन यदि आपको कठिनाई हो तो यहां वापस पोस्ट करने के लिए स्वतंत्र महसूस करें।
अंत में, मैं सुझाव दूंगा कि यह पूरा ऑपरेशन लेनदेन के भीतर किया जाता है ताकि आपको कुछ गलत होने पर आधे पूर्ण प्रतियों से बचाया जा सके।
कुछ अस्वीकरण: उपरोक्त सभी को तुरंत टाइप किया गया था, यह उम्मीद नहीं है कि यह बल्ले से काम करे। दूसरा, मैंने माना है कि आपके सभी पीके पहचान क्षेत्र हैं, जिन्हें वे होना चाहिए! यदि वे अगले आईडी उत्पन्न करने के लिए उचित तर्क के साथ SCOPE_IDENTITY() कॉल को प्रतिस्थापित नहीं कर रहे हैं।
संपादित करें: documentation for Cursor operations can be foundhere
मैं वास्तव में यहाँ समस्या का हल नहीं ... बस डेटा की प्रतिलिपि और 'सेट identity_insert [तालिका एक] ON' B & सी – Jamiec
के लिए एक ही का उपयोग कर सम्मिलित न अगर मैं तालिका ए में एक रिकॉर्ड डालें, इस रिकॉर्ड को एक आईडी मिलती है, मान लें 104. इससे पहले, मुझे तालिका बी में एक नई पंक्ति डालना है, जिसमें tableA का संदर्भ है, इसलिए table_A_id समान होना चाहिए: 104 – Martijn
नहीं होना चाहिए जब तक आप कॉपी कर रहे हों, तब तक एक समस्या खाली है, क्योंकि नए डेटा में समान PK का IDENTITY_INSERT का उपयोग किया जाएगा। आप कहां कॉपी करने की कोशिश कर रहे हैं? शायद एक और समान डेटाबेस? – Jamiec