SQL सर्वर में एक डेटाबेस से दूसरे में तालिकाओं की प्रतिलिपि बनाएँ


324

मेरे पास एक डेटाबेस है जिसे फू कहा जाता है और एक डेटाबेस जिसे बार कहा जाता है। मेरे पास foo में एक तालिका है जिसे tblFoobar कहा जाता है जिसे मैं डेटाबेस फू से डेटाबेस बार में (डेटा और सभी) स्थानांतरित करना चाहता हूं। यह करने के लिए SQL कथन क्या है?

जवाबों:


208

SQL सर्वर पर? और एक ही डेटाबेस सर्वर पर? नामकरण तीन भाग का उपयोग करें।

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

यह सिर्फ डेटा को स्थानांतरित करता है। यदि आप तालिका परिभाषा (और अन्य विशेषताएँ जैसे अनुमतियाँ और अनुक्रमणिका) को स्थानांतरित करना चाहते हैं, तो आपको कुछ और करना होगा।


मेरा मानना ​​है कि आपको अलग से टेबल की अनुमति भी देनी होगी।
केन रे

1
यदि आपको पहचान आवेषण भी करने की आवश्यकता है, तो डेटा आयात विज़ार्ड के पास उसके लिए एक विकल्प है ^ ^ - अन्य उत्तर का उल्लेख करते हुए
क्लेरेंस लियू

13
@TahaRehmanSiddiqui: क्योंकि यह सवाल का जवाब देता है;) उन्होंने यह नहीं पूछा कि इसे डेटाबेस सर्वरों के बीच कैसे कॉपी किया जाए। लेकिन उस उत्तर की तलाश करने वाले अधिकांश लोग यहाँ समाप्त होते हैं, क्योंकि Google इसे पहले परिणाम के रूप में देता है :)
Maarten Kieft

1
@RyanB हाँ, यह अनुमति है।
एमी बी

1
@ ओटी और इस सवाल पर आने वाले कई लोग "एसक्यूएल स्टेटमेंट" की तलाश कर रहे हैं, टूल की नहीं।
एमी बी

535

SQL सर्वर प्रबंधन स्टूडियो का "आयात डेटा" कार्य (DB नाम पर राइट-क्लिक करें, तो कार्य) आपके लिए यह सबसे अधिक करेगा। उस डेटाबेस से चलाएँ, जिसमें आप डेटा को कॉपी करना चाहते हैं।

यदि टेबल मौजूद नहीं है, तो यह आपके लिए उन्हें बनाएगा, लेकिन आपको संभवतः किसी भी अनुक्रमित और ऐसे को फिर से बनाना होगा। यदि टेबल मौजूद हैं, तो यह नए डेटा को डिफ़ॉल्ट रूप से जोड़ देगा लेकिन आप इसे समायोजित कर सकते हैं (मैपिंग संपादित कर सकते हैं) ताकि यह मौजूदा डेटा को हटा देगा।

मैं हर समय इसका उपयोग करता हूं और यह काफी अच्छी तरह से काम करता है।


1
मुझे यह विकल्प नहीं मिल रहा है। क्या यहाँ कुछ संस्करण विशिष्ट है?
नेरवे

35
आप वास्तव में यह नहीं कह सकते कि यह आम तौर पर एक बेहतर जवाब है। उदाहरण के लिए किसी स्क्रिप्ट के भीतर से स्वचालन के लिए यह अनुपयोगी है। BTW लेखक ने विशेष रूप से ".. SQL कथन .." के लिए कहा। लेकिन निश्चित रूप से यह एक महान जवाब है, लेकिन बेहतर नहीं है;)।
ग्रिजली

3
लेखक ने "(डेटा और सभी)" को स्थानांतरित करने के लिए कहा; इसलिए मुझे आशा है कि इस उत्तर ने ऐसा किया है। यह तालिका बनाता है, लेकिन कोई कुंजी या इंडेक्स नहीं बनाता है; तो एसक्यूएल जवाब पर एक सुधार के ज्यादा नहीं।
जुबेर

क्या WHEREआयात डेटा कार्य का उपयोग करके किसी शर्त को निर्दिष्ट करना संभव है ? मुझे ऐसा करने का तरीका नहीं मिल रहा था।
क्रश करें

1
हाँ यह सही तरीका है जैसा कि यहाँ भी उल्लेख किया गया है, लेकिन identityऔर foreign keyगंतव्य डेटाबेस, किसी भी समाधान में संदर्भ हटा दिए जाते हैं?
शैजुत

106

यह काम करना चाहिए:

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

यह कमी, चूक या सूचकांक की नकल नहीं करेगा । बनाई गई तालिका में क्लस्टर अनुक्रमणिका नहीं होगी ।

वैकल्पिक रूप से आप कर सकते हैं:

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

यदि आपकी गंतव्य तालिका मौजूद है और खाली है।


क्या कोई समस्या है अगर आप पहली बार आधार तालिका संरचना (फ़ील्ड और डेटा) की प्रतिलिपि बनाएँ और फिर अनुमतियाँ, अनुक्रमणिका, बाधाएँ और विस्तारित गुण बनाने के लिए पैच स्क्रिप्ट लागू करें ?
leoinfo

4
यह SQL Server 2008 में पहचान स्तंभों के लिए मान नहीं डालेगा। यह केवल तब होता है जब आप एक स्तंभ सूची का उपयोग करते हैं और गंतव्य तालिका के लिए IDENTITY_INSERT चालू होता है।
लुकास विल्सन-रिक्टर

@ लुकास - आप "आधा" सही हैं :)। हालाँकि, पहले SQL स्टेटमेंट सभी डेटा को पहचानता है, जिसमें पहचान कॉलम के मान भी शामिल हैं। जैसा कि मैंने कहा, अड़चनें नहीं बनी हैं। लेकिन उन्हें आसानी से स्रोत DB पर स्क्रिप्ट किया जा सकता है और सभी डेटा ले जाने पर DB को गंतव्य पर लागू किया जा सकता है।
leoinfo

दूसरे संस्करण ( INSERT INTO...) ने मेरे लिए ओरेकल में काम किया।
vapcguy

क्या यह काम करता है अगर 2 डेटाबेस अलग-अलग कनेक्शन स्ट्रिंग्स के साथ पूरी तरह से अलग सर्वर पर हैं? यदि नहीं, तो आप इसे कैसे संभालेंगे?
अलेक्जेंडर रयान बैगेट

46

यदि यह केवल एक टेबल है तो आपको बस इतना करना है

  • स्क्रिप्ट तालिका परिभाषा
  • दूसरे डेटाबेस में नई तालिका बनाएं
  • नियम, अनुक्रमणिका, अनुमतियाँ और ऐसे अद्यतन करें
  • आयात डेटा (उदाहरण में कई सम्मिलित पहले से ही ऊपर दिखाए गए हैं)

एक बात जिस पर आपको विचार करना होगा वह है अन्य अपडेट जैसे कि भविष्य में अन्य वस्तुओं को माइग्रेट करना। ध्यान दें कि आपके स्रोत और गंतव्य तालिकाओं में समान नाम नहीं है। इसका मतलब यह है कि अगर आपको ऑब्जेक्ट्स जैसे विचार, संग्रहीत कार्यविधियाँ और अन्य निर्भर हैं तो आपको भी बदलाव करने होंगे।

एक या कई वस्तुओं को आप किसी भी मुद्दे पर मैन्युअल रूप से w / o जा सकते हैं। हालाँकि, जब कुछ अपडेट्स से अधिक होते हैं, तो 3 पार्टी तुलना उपकरण बहुत काम आते हैं। अभी मैं स्कीमा माइग्रेशन के लिए ApexSQL Diff का उपयोग कर रहा हूं लेकिन आप किसी अन्य टूल के साथ गलत नहीं कर सकते।


23
  1. स्क्रिप्ट create tableप्रबंधन स्टूडियो में, कि स्क्रिप्ट पट्टी में तालिका बनाने के लिए चलाते हैं। (ऑब्जेक्ट एक्सप्लोरर में राइट क्लिक टेबल, स्क्रिप्ट टेबल के रूप में, बनाएं ...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table


1
मुझे यह तरीका पसंद है। यदि कोई पहचान स्तंभ है, तो चयन करें * काम नहीं करेगा, आपको कॉलम नामों को स्पष्ट रूप से सूचीबद्ध करना होगा। आपको SET IDENTITY_INSERT TblName ONउस मामले में भी करना होगा ।
जेरेमी वेइर

16

SQL स्क्रिप्ट के निर्माण में मदद के लिए आप SQL सर्वर स्क्रिप्ट्स विज़ार्ड जनरेट का उपयोग भी कर सकते हैं जो निम्न कार्य कर सकता है:

  • तालिका स्कीमा की प्रतिलिपि बनाएँ
  • कोई भी बाधा (पहचान, डिफ़ॉल्ट मान आदि)
  • तालिका के भीतर डेटा
  • और यदि आवश्यक हो तो कई अन्य विकल्प

यहां दिखाए गए स्क्रीन शॉट्स के साथ SQL सर्वर 2008 के लिए अच्छा उदाहरण वर्कफ़्लो ।


ऊपर मेरी टिप्पणी देखें:?!? "कैसे यह 508/171 वोट मिलता है और रयान की थी" अक्टूबर 11 '11 23:41 पर "उत्तर केवल 13 तारीख को पाने रयान की है केवल का जवाब । कि इसका जवाब सेशन के क्ष है पूरी तरह सेक्योंकि यह इन परिदृश्यों को संभालता है (जो, btw, ओपी ने अपने q से बाहर नहीं किया था।): a) पहचान ( बहुत सामान्य), b) बाधाएं, c) ट्रिगर, d) अनुक्रमित, e) अनुमतियाँ, d) योजनाओं और डेटा की प्रतिलिपि बनाना ( संकेत: ऑप के "(और सभी" भाग का हिस्सा (डेटा और सभी) "स्कीमा का भी अर्थ है।) और ई)" एसक्यूएल स्टेटमेंट "उत्पन्न करता है, जो ऑप निर्दिष्ट करता है, भले ही उसका मतलब यह न हो कि इसका शाब्दिक अर्थ बेहतर है। से ज्यादा नहीं। ”।
टॉम

1
नोट: यह उत्तर केवल तभी व्यावहारिक है जब # पंक्तियाँ "अत्यधिक" (यानी लुकअप / छोटे लेन-देन तालिकाएँ) न हों और "बड़े" कॉलम मान न हों। उन लोगों के लिए, मैं तालिका के लिए स्क्रिप्ट उत्पन्न करने के लिए रयान के उत्तर का उपयोग करूंगा (incl। कॉलम एट्रीब्यूट्स एंड सब-ऑब्जेक्ट्स) क्रिएशन, और फिर डेविड बी के "इन्सर्ट इन सलेक्ट" उत्तर का उपयोग करें। सिंगल टेबल्स (रयान ए के बजाय) के लिए, आप SSMS, ऑब्जेक्ट एक्सप्लोरर, राइट-क्लिक टेबल, स्क्रिप्ट टेबल का उपयोग कर सकते हैं, जैसे कि, क्रीएट टू, लेकिन आपको 1 टूल, विकल्प, SQL सर्वर ऑब्जेक्ट एक्सप्लोरर, स्क्रिप्टिंग विकल्प बनाना होगा। इच्छानुसार सेट।
टॉम

9

आप इस तरह से जा सकते हैं: (एक सामान्य उदाहरण)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

इसके अलावा अगर आपको कॉलम के नाम उत्पन्न करने के साथ-साथ इंसर्ट क्लॉज लगाने की जरूरत है, तो उपयोग करें:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

परिणाम को कॉपी करें और अपने टेबल कॉलम नामों का प्रतिनिधित्व करने के लिए क्वेरी विंडो में पेस्ट करें और यहां तक ​​कि पहचान कॉलम को भी बाहर कर देगा:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

याद रखें कि पंक्तियों को कॉपी करने के लिए स्क्रिप्ट काम करेगी यदि डेटाबेस उसी स्थान के हैं।


आप यह कोशिश कर सकते हैं।

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

सर्वर नाम वैकल्पिक है यदि दोनों DB एक ही सर्वर में है।


1

यदि मौजूदा तालिका है और हम केवल डेटा की प्रतिलिपि बनाना चाहते हैं, तो हम इस क्वेरी को आज़मा सकते हैं।

Destination_Existing_Tbl में सम्मिलित करें col1, col2 FROM Source_Tbl से चुनें


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.