2010-11-03 18 views
7

में डेटाबेस के बीच पंक्तियों की प्रतिलिपि बनाएँ एक डेटाबेस में एक तालिका में बड़ी मात्रा में पंक्तियों को एक अलग डेटाबेस में दूसरी तालिका में कॉपी करने का सबसे प्रभावी तरीका क्या है जिसमें सटीक समान संरचना है?एसक्यूएल सर्वर

उत्तर

13

अपनी लॉग आईओ सबसिस्टम यह तो अनुमति देता है,:

INSERT INTO target(field1, field2, field3) 
SELECT field1, field2, field3 FROM source; 

लेकिन पूरे हस्तांतरण एक ही बयान में पाए जाते हैं होने के लिए एक एकल लेन-देन, जिसका अर्थ है x2.5 डेटा आकार लॉग उत्पन्न हो गया है और इसका मतलब है कि पूरे विवरण के दौरान रखा गया। अर्थात। यदि आप 50 जीबी स्थानांतरित करते हैं, तो आपका लक्ष्य डीबी लॉग 250 जीबी तक बढ़ेगा (भले ही रिकवरी मोड सरल पर सेट हो!)।

यदि आप लॉग के बारे में चिंतित हैं, तो आपको बैचों में स्थानांतरित करना होगा। आप अभी भी INSERT कर सकते हैं ... चाल चुनें, लेकिन आपके चयन को कुछ महत्वपूर्ण रेंज और बैच स्वीकार्य संख्या पंक्तियों का उपयोग करना होगा।

आखिरकार, आप हमेशा bcp out कर सकते हैं bcp in के बाद, यह बहुत तेज़ काम करेगा और शायद विश्वसनीय हस्तांतरण प्राप्त करने का सबसे तेज़ तरीका है।

+0

क्या 'INSERT में कोई अंतर है ... चुनें ...' बनाम 'चयन करें ... में ...'? या बाद में सिर्फ वाक्य रचनात्मक चीनी है? इस तथ्य के अलावा कि तालिका पहले से मौजूद नहीं हो सकती है ... INTO ... '। –

+1

'चुनें ... में ...' यदि संभव हो तो बेहतर है। यदि डेटाबेस थोक लॉग मोड में है तो यह काफी कम होगा। यह भी तेज़ है क्योंकि परिभाषा के अनुसार लक्ष्य किसी भी एनसी इंडेक्स के ढेर w/o है, इसलिए यह सबसे तेज़ संभव सम्मिलन होगा। लेकिन तालिका केवल * मौजूद नहीं होने पर ही समस्या हो सकती है, और ओपी ने पहले से मौजूद सारणी का उल्लेख किया है। –

14

तो एक ही सर्वर पर databasesare, तो यह तुच्छ है - आप यह कर के रूप में चाहते हैं अगर आप एक ही डेटाबेस में तालिकाओं के बीच कॉपी कर रहे थे यानी,:,

INSERT INTO targetdatabase..targettable (col1, col2, col3, col4) 
    SELECT col1, col2, col3, col4 FROM sourcedatabase..sourcetable 

डेटाबेस अलग सर्वर पर कर रहे हैं आपको क्वेरी करने के लिए OPENQUERY, OPENROWSET या लिंक किए गए सर्वरों में से किसी एक का उपयोग करने की आवश्यकता होगी, लेकिन मूल रूप से इन सभी के साथ भी, आप अभी भी उपरोक्त आदेश पर एक भिन्नता लिख ​​रहे होंगे।

वैकल्पिक रूप से, यह बीसीपी आउट और बीसीपी का एक मामला है या SQL सर्वर प्रबंधन स्टूडियो के डेटा ट्रांसफर विज़ार्ड का उपयोग कर रहा है।

2

एक आसान तरीका डेटाबेस पर SSMS और राइट क्लिक करें खोलने के लिए और कार्य> डेटा आयात करने के लिए जाने के लिए और स्रोत और गंतव्य सेट करने के लिए विज़ार्ड का पालन है।

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

गंतव्य से एक ही समय में डेटा जोड़ना या साफ़ करना।

0

डालने CRS_New.dbo.SalesUpdateRBCustomerExternalRelationShipData_V1 (RBCustomerExternalEdgeKeyFather, RBCustomerExternalEdgeKeySon, EdgeLevelIndicator, स्थिति, संस्करण, StatusValidFrom, ActiveIndicator, AddAttributeList_id) चयन RBCustomerExternalEdgeKeyFather, RBCustomerExternalEdgeKeySon, EdgeLevelIndicator, स्थिति, संस्करण, स्थिति ValidFrom, ActiveIndicator, AddAttributeList_id CRS.dbo.SalesUpdateRBCustomerExternalRelationShipData_V11

+0

DBName.dbo.TableName (col1, col2 ...) में डालें। कॉलम सूचियों की कमी के कारण DBName.dbo.TableName –

0
Insert into targetdatabase.dbo.tablename 
select * from sourcedatabase.dbo.tablename 

नोट: .dbo महत्वपूर्ण

है कॉलम स्रोत और लक्ष्य तालिकाओं में अलग तो स्पष्ट रूप से दोनों तालिकाओं के लिए कॉलम का उल्लेख कर रहे हैं।ध्यान रखें कि डेटा प्रकार समान होना चाहिए

+0

से नीचे (col1, col2 ...) का चयन करें –

+1

:) मैंने इसका उल्लेख किया है ... अगर आपके कॉलम स्रोत और लक्ष्य में भिन्न हैं, आपको इसका उल्लेख करने की आवश्यकता है, अन्यथा यह –

+0

काम करेगा, भले ही वे वही हों, आपको उन्हें शामिल करने की आवश्यकता है। अन्यथा जब आप बाद में स्रोत या लक्ष्य को कॉलम में जोड़ते हैं तो यह टूट जाता है .... जो भी बदतर है। रक्षात्मक प्रोग्रामिंग –

संबंधित मुद्दे