2010-07-27 7 views
5

मैं कुछ डेटा को एक डीबी से दूसरे में डंप करने जा रहा हूं। मैंकॉलम नाम सूची के बिना tsql पहचान सम्मिलन

set identity_insert MyTable on 
GO 
INSERT INTO MyTable SELECT * FROM sourceDB.dbo.MyTable 
GO 
set identity_insert MyTable off 

क्या यह काम करने के लिए है? 30 टेबल हैं और कॉलम नामों की सूची सम्मिलित कथन में जोड़ने में समय लगेगा। मैं SQL सर्वर 2000 का उपयोग कर रहा हूं। निकट भविष्य में SQL सर्वर 2008 में अपग्रेड किया जाएगा।

संपादित करें: मायटेबल में पहचान कॉलम है।

+0

क्या काम नहीं कर रहा है ?? त्रुटि क्या है? –

+0

तालिका 'MyTable' में पहचान कॉलम के लिए एक स्पष्ट मान केवल तभी निर्दिष्ट किया जा सकता है जब कॉलम सूची का उपयोग किया जाता है और IDENTITY_INSERT चालू होता है। – David

+0

लेकिन अगर मैं MyTable (Col1, Col2, ..., LastColumn) में INSERT में सम्मिलित कथन बदलता हूं * SourceDB.dbo.MyTable से चुनें। फिर यह O_O – David

उत्तर

4

ऑब्जेक्ट ब्राउज़र से कॉलम नाम खींचें और छोड़ें। आप इसे एक चरण में लिख सकते हैं, इसे चुनने से लगभग 1 सेकंड लंबा लगता है * और आपको कभी भी उत्पादन कोड में चयन * का उपयोग नहीं करना चाहिए। यह एक खराब अभ्यास है।

हालांकि मैं आपके बारे में चिंतन कॉलम डालने के बारे में चिंतित हूं, यह ऐसा कुछ है जो लगभग कभी नहीं किया जाना चाहिए। क्या होगा यदि मूल तालिका में कुछ पहचान कॉलम हों जो नई तालिका में ids से बाहर निकलने के समान हैं? किसी अन्य तालिका से आईडी मान डालने का निर्णय लेने से पहले इसे जांचना सुनिश्चित करें। मैं अभिभावक तालिका में सम्मिलित करना पसंद करता हूं और एक नई आईडी प्राप्त करता हूं और इसे पुराने आईडी से मिलान करता हूं (आउटपुट 2008 में इसके लिए अच्छा है) और उसके बाद किसी भी बच्चे की टेबल के लिए नई आईडी का उपयोग करें, लेकिन पुरानी आईडी पर शामिल हों।

+0

धन्यवाद। मैं कुछ परीक्षण करने के लिए एक dev सर्वर पर 30 कुछ टेबल डुप्लिकेट कर रहा हूं। – David

3

SQL Server 2000 SP2 मशीन पर इस परिदृश्य को अभी करने का प्रयास करने के बाद, मुझे यह त्रुटि प्राप्त होती है, और आपके अवलोकनों की पुष्टि करने लगता है।

तालिका 'Foo2' में पहचान कॉलम के लिए एक स्पष्ट मान केवल तभी निर्दिष्ट किया जा सकता है जब कॉलम सूची का उपयोग किया जाता है और IDENTITY_INSERT चालू होता है।

set identity_insert Foo2 on 
GO 
INSERT INTO Foo2 select top 100 * from Foo where id > 110000 
GO 
set identity_insert Foo2 off 

SELECT INTO सुझाव केवल एक मचान तालिका में डेटा प्राप्त करने के लिए मदद मिलेगी। किसी बिंदु पर, आपको कॉलम नामों को स्पष्ट रूप से अवश्य देना होगा।

कॉलम नामों पर युक्ति: एसएसएमएस क्वेरी में तालिका को हाइलाइट करें, और Alt-F1 (sp_help के लिए शॉर्टकट) दबाएं। इसके बाद आप परिणामस्वरूप column_name को अपनी क्वेरी में कॉपी/पेस्ट कर सकते हैं, और बस कॉमा को हाथ से जोड़ सकते हैं। शॉर्टकट को एक कदम आगे ले जाएं, और उन्हें Excel में पेस्ट करें, एक कॉमा टाइप करें और कॉलम कॉपी करें।

+0

+1 काम करता है। अजीब। 2005 ने बिना किसी झुकाव के किया। – Tobiasopdenbrouw

+0

@Tobiasopdenbrouw मुझे एसक्यूएल सर्वर 2005 पर एक ही त्रुटि मिली। – David

0

आप आईडी स्तंभ के मूल्यों के संरक्षण की जरूरत नहीं है, तो आप कर सकते हैं:

आईडी स्तंभ

ड्रॉप नया लक्ष्य डीबी में अपने नए स्कीमा में एक आईडी स्तंभ हैं (यह कर कॉलम सूची में अंतिम कॉलम)

INSERT INTO newdb.dbo.newtable 
SELECT * FROM olddb.dbo.oldtable 

और यह नई आईडी जानकारी उत्पन्न करते समय आपके शेष कॉलम को सुरक्षित रखेगा।

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