2010-10-08 16 views
8

मेरे पास समान संरचना के साथ दो टेबल हैं और फ़ील्ड की बहुत बड़ी संख्या (लगभग 1000) है। मुझे 2 ऑपरेशंस करने की आवश्यकता है 1) दूसरी पंक्ति से मुट्ठी में सभी पंक्तियों से डालें। उदाहरण:कॉलम नाम निर्दिष्ट किए बिना किसी एक तालिका को एक से अपडेट कैसे करें?

INSERT INTO [1607348182] 
SELECT * 
FROM _tmp_1607348182; 

2) दूसरी तालिका से पहले तालिका अद्यतन लेकिन अद्यतन के लिए मैं अद्यतन के लिए उचित एसक्यूएल वाक्य रचना नहीं मिला सकते हैं।

प्रश्नों की तरह:

Update [1607348182] 
set [1607348182].* = tmp.* 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

या

Update [1607348182] 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

अमान्य हैं।

+3

मैं एक 'ट्रिगर' का उपयोग करने या अपनी स्कीमा को संशोधित करने की अनुशंसा करता हूं ताकि आपको ऐसा करने की आवश्यकता न हो। –

+0

मुझे समझ में नहीं आता है। आपके पहले अपडेट के बाद दो तालिकाओं में समान पंक्तियां होंगी, तो आप उम्मीद कर रहे हैं कि दूसरा अपडेट क्या करेगा? – PaulG

+0

ट्रैविस जी, मैं डीबी स्कीमा को संशोधित करने के लिए आपसे सहमत हूं लेकिन दुर्भाग्य से मुझे अपनी परियोजना में इस स्कीमा का पालन करना चाहिए। – amuliar

उत्तर

3

यह सुनिश्चित नहीं है कि आप एक चर में अद्यतन कथन बनाने के लिए गतिशील एसक्यूएल का उपयोग किये बिना इसे पूरा करने में सक्षम होंगे।

यह बयान तालिका नाम आप में डाल के आधार पर कॉलम की एक सूची वापस आ जाएगी:

select name from syscolumns 
where [id] = (select [id] from sysobjects where name = 'tablename') 

सुनिश्चित नहीं हैं कि अगर मैं एक पाश यहाँ से बच सकते हैं .... आप से परिणाम लोड करने की आवश्यकता होगी एक कर्सर में ऊपर और फिर उससे एक क्वेरी बनाएँ। छद्म कोडित:

set @query = 'update [1607348182] set ' 
load cursor --(we will use @name to hold the column name) 
while stillrecordsincursor 
set @query = @query + @name + ' = tmp_[1607348182]. ' [email protected] + ',' 
load next value from cursor 
loop! 

जब क्वेरी पाश में बनाया जा रहा किया जाता है, कार्यकारी sp_executesql @query का उपयोग करें।

बस थोड़ी सी चेतावनी ... इस तरह के लूप में गतिशील एसक्यूएल का निर्माण थोड़ा उलझन में हो सकता है। मुसीबत शूटिंग के लिए, लूप में एक चुनिंदा @query डालें और @query को बनाया गया देखें।

संपादित करें: सुनिश्चित नहीं है कि आप एक ही समय में सभी 1000 पंक्तियों को एक बार में करने में सक्षम होंगे ... तर्कसंगत सीमाएं (वर्कर (8000)?) आकार पर है जो @query भी बढ़ सकता है। आपको कोड को विभाजित करना पड़ सकता है ताकि यह एक समय में 50 कॉलम संभाल सके। कॉलम को syscolumns चयन कथन से एक आईडी के साथ एक temp तालिका में रखें और अपना गतिशील एसक्यूएल बनाएं ताकि यह एक समय में 20 कॉलम (या 50?) अपडेट हो।

एक और विकल्प बड़े पैमाने पर इसे बनाने के लिए एक्सेल का उपयोग करना होगा। कॉलम का चयन करें और परिणामों को कॉलम में स्प्रेडशीट में कॉपी करें। रखो '= कॉलम बी, टीएमपी में। [12331312] कॉलम सी में, कॉलम डी में कॉलम कॉपी करें, और कॉलम ई में कॉमा करें। संपूर्ण स्प्रेडशीट को नोटपैड में कॉपी करें, और आपके पास आपके लिए बनाए गए अद्यतन कथन के कॉलम होना चाहिए। एक बुरा समाधान नहीं है अगर यह एक शॉट घटना है, तो सुनिश्चित नहीं है कि मैं इस पर चल रहे समाधान के रूप में भरोसा करता हूं।

+0

यह एक अच्छा समाधान प्रतीत होता है क्योंकि ऐसा करने के लिए एसक्यूएल में कोई मूल अभिव्यक्ति नहीं है। इसके अलावा मुझे परिवर्तनीय आकार के कॉलम से संबंधित SQL सर्वर की अन्य सीमाओं के साथ परेशानी थी।(मुझे यह भी पता है कि मेरी समस्याएं खराब डीबी स्कीमा से उत्पन्न होती हैं) तो आपका समाधान सबसे अच्छा प्रतीत होता है क्योंकि मैं इस SQL ​​कथन को कैश कर सकता हूं और बाद में अन्य अनुरोधों में पुन: उपयोग कर सकता हूं। – amuliar

+0

वर्कर (8000) सीमा के बारे में। मैं वर्कर (MAX) बना सकता हूं वैसे भी – amuliar

+0

अच्छा बिंदु, मैं हाल ही में विरासत डेटाबेस में काम कर रहा हूं और वर्चर (अधिकतम) के बारे में भूल गया हूं। गरीब डीबी स्कीमा के संबंध में ... मुझे लगता है कि आप एक पुराने स्कीमा से काम कर रहे हैं (शायद ही कभी फ्लैटफाइल/आईडीबीएमएस के बाहर संख्याओं वाली नाम वाली टेबल देखें)। विरासत प्रणाली से एक सामान्यीकृत डेटाबेस में रात का आयात विचार करने का एक अच्छा विकल्प हो सकता है, अन्यथा आप इस गरीब स्कीमा के साथ काम करने में अपेक्षाकृत बड़ी मात्रा में देख रहे हैं जो आपके द्वारा किए जाने वाले प्रत्येक प्रोजेक्ट में जोड़ा जाएगा। – Twelfth

5

क्या यह मास्टर टेबल से सबकुछ हटाने के लिए काम करेगा जिसमें temp में एक आईडी थी, फिर नए डेटा के साथ सम्मिलित करें?

+0

की आवश्यकता है हां, मैंने इस समाधान को महसूस किया और इसे कार्यान्वित किया। धन्यवाद – amuliar

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

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