2009-08-12 17 views
7

के बिना एक तालिका से सभी तालिकाओं में सभी रिकॉर्ड्स डालें, मैं बैक अप तालिका foo_bk से सभी रिकॉर्ड को बिना कॉलम के foo_bk में सम्मिलित करना चाहता हूं।एसक्यूएल: कॉलम

अगर मैं इस क्वेरी कोशिश

INSERT INTO foo 
SELECT * 
FROM foo_bk 

मैं त्रुटि "डालें त्रुटि: स्तंभ का नाम या आपूर्ति किए गए मान की संख्या तालिका परिभाषा से मेल नहीं खाता।" मिल जाएगा

कॉलम नाम की आपूर्ति किए बिना एक टेबल से दूसरे टेबल में थोक सम्मिलन करना संभव है? मैंने इसे Google किया है लेकिन मुझे कोई जवाब नहीं मिल रहा है। सभी उत्तरों को विशिष्ट कॉलम की आवश्यकता होती है।

उत्तर

2

आपको कम से कम कॉलम की संख्या की आवश्यकता है और प्रत्येक कॉलम को उसी तरह परिभाषित किया जाना चाहिए, यानी एक वर्चर कॉलम को इंट कॉलम में डाला नहीं जा सकता है।

थोक हस्तांतरण के लिए, आप जिस SQL ​​कार्यान्वयन का उपयोग कर रहे हैं उसके लिए प्रलेखन जांचें। थोक स्थान डेटा को एक टेबल से दूसरे में अक्सर उपकरण उपलब्ध होते हैं। एसक्यूएल सर्वर 2005 के लिए, उदाहरण के लिए, आप SQL सर्वर आयात और निर्यात विज़ार्ड का उपयोग कर सकते हैं। जिस डेटाबेस में आप डेटा को स्थानांतरित करने का प्रयास कर रहे हैं उस पर राइट-क्लिक करें और इसे एक्सेस करने के लिए निर्यात पर क्लिक करें।

1

एसक्यूएल 2008 आप अपने चयन के स्तंभ नाम को निर्दिष्ट छोड़ अगर आप बल्कि INSERT INTO/चयन से चयन में उपयोग की अनुमति देता है:

SELECT * 
INTO Foo 
FROM Bar 
WHERE x=y 

INTO खंड एसक्यूएल सर्वर 2000-2005 में मौजूद है, लेकिन अभी भी आवश्यकता है कॉलम नाम निर्दिष्ट करना। 2008 में SELECT * का उपयोग करने की क्षमता जोड़ने लगती है।

विवरण के लिए आईएनटीओ (SQL2005), (SQL2008) पर एमएसडीएन लेख देखें।

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

+1

यह केवल एक नई तालिका पर काम करता है जाएगा। – JeffO

+1

यदि तालिका पहले से मौजूद है तो INTO काम नहीं करता है। – HLGEM

+0

और हाँ आप स्पष्टीकरण के लिए धन्यवाद, एसक्यूएल सर्वर 2000 – HLGEM

16

आपको कभी ऐसा नहीं करना चाहिए। चयन करें * को सम्मिलित करने के आधार के रूप में उपयोग नहीं किया जाना चाहिए क्योंकि कॉलम चारों ओर स्थानांतरित हो सकते हैं और आपके सम्मिलन को तोड़ सकते हैं (या इससे भी बदतर नहीं है कि आपके सम्मिलन को तोड़ दें लेकिन आपके डेटा को गड़बड़ न करें। मान लीजिए कि कोई चयन में तालिका में कॉलम जोड़ता है लेकिन नहीं दूसरी तालिका, आप कोड तोड़ देंगे। या किसी को लगता है कि समझ को पार करने के कारणों से अक्सर होता है, लेकिन अक्सर होता है, एक बूंद करने का फैसला करता है और एक टेबल पर फिर से बना देता है और कॉलम को एक अलग क्रम में ले जाता है। अब आपका अंतिम_नाम स्थान है first_name मूल रूप से और चयन * इसे अन्य तालिका में गलत कॉलम में डाल देगा। यह कॉलम निर्दिष्ट करने में विफल होने के लिए एक बेहद खराब अभ्यास है और उस कॉलम में एक कॉलम के विशिष्ट मैपिंग को आप जिस तालिका में रुचि रखते हैं उसमें चाहते हैं।

अभी आपको कई समस्याएं हो सकती हैं, पहले दो संरचनाएं सीधे मेल नहीं खाती हैं या दूसरी तालिका को पहचान सह करने के लिए डाला जा रहा है शरद ऋतु और इसलिए भले ही सम्मिलित कॉलम एक सीधा मैच हैं, फिर भी तालिका को दूसरे के मुकाबले एक और कॉलम डाला जा रहा है और डेटाबेस निर्दिष्ट नहीं कर रहा है कि आप उस कॉलम में सम्मिलित करने का प्रयास करेंगे। या आपके पास कॉलम की एक ही संख्या हो सकती है लेकिन एक पहचान है और इस प्रकार इसे सम्मिलित नहीं किया जा सकता है (हालांकि मुझे लगता है कि यह एक अलग त्रुटि संदेश होगा)।

10

इस अन्य पोस्ट के अनुसार: Insert all values of a..., आप निम्न कर सकते हैं:

INSERT INTO new_table (Foo, Bar, Fizz, Buzz) 
SELECT Foo, Bar, Fizz, Buzz 
FROM initial_table 

यह रूप में अन्य उत्तर ने संकेत दिया स्तंभ नाम निर्दिष्ट करने के लिए महत्वपूर्ण है।

0

जैसा कि आप शायद पिछले उत्तरों से समझते हैं, आप वास्तव में जो भी कर रहे हैं वह वास्तव में नहीं कर सकते हैं। मुझे लगता है कि आप समस्या को समझ सकते हैं SQL सर्वर का अनुभव यह नहीं है कि अतिरिक्त/अनुपलब्ध कॉलम को कैसे मैप करना है।

यह कहा गया है, चूंकि आप उल्लेख करते हैं कि आप जिस चीज का प्रयास कर रहे हैं उसका उद्देश्य बैकअप है, शायद हम SQL सर्वर के साथ काम कर सकते हैं और इस मुद्दे को हल कर सकते हैं। नहीं अपने सटीक परिदृश्य जानते हुए भी यह असंभव एक सही जवाब के साथ यहाँ हिट करने के लिए करता है, लेकिन मैं निम्नलिखित मान:

  • आप एक मेज के लिए एक बैकअप/लेखा परीक्षा की प्रक्रिया का प्रबंधन करना चाहते हैं।
  • आपके पास शायद उनमें से कुछ हैं और प्रत्येक कॉलम अतिरिक्त/निष्कासन पर निर्भर वस्तुओं को बदलने से बचना चाहते हैं।
  • बैकअप तालिका में ऑडिटिंग उद्देश्यों के लिए अतिरिक्त कॉलम हो सकते हैं।

मैं तुम्हारे लिए दो विकल्पों का सुझाव चाहते हैं:

कुशल अभ्यास (IMO) इस के लिए DDL चलाता का उपयोग कर स्कीमा परिवर्तन का पता लगाने और बैकअप तालिका तदनुसार परिवर्तन करने के लिए उन्हें इस्तेमाल हो सकता है। यह आपको 'चयन * से ...' दृष्टिकोण का उपयोग करने में सक्षम करेगा, क्योंकि कॉलम सूची दो तालिकाओं के बीच सुसंगत रहेगी।

मैंने इस दृष्टिकोण का सफलतापूर्वक उपयोग किया है और आप इसका लाभ उठा सकते हैं ताकि डीडीएल ट्रिगर स्वचालित रूप से आपकी ऑडिटिंग टेबल प्रबंधित कर सकें। मेरे मामले में, मैंने एक टेबल के लिए एक नामकरण सम्मेलन का उपयोग किया जिसमें लेखा परीक्षा की आवश्यकता थी और डीडीएल ट्रिगर ने इसे फ्लाई पर प्रबंधित किया था।

एक अन्य विकल्प है कि आपके विशिष्ट परिदृश्य के लिए उपयोगी हो सकता है टेबल कॉलम सूची संरेखित के लिए एक समर्थन दृश्य बनाने के लिए है। यहां एक त्वरित उदाहरण है:

create table foo (id int, name varchar(50)) 
create table foo_bk (id int, name varchar(50), tagid int) 
go 

create view vw_foo as select id,name from foo 
go 

create view vw_foo_bk as select id,name from foo_bk 
go 

insert into vw_foo 
    select * from vw_foo_bk 
go 

drop view vw_foo 
drop view vw_foo_bk 
drop table foo 
drop table foo_bk 
go 

मुझे आशा है कि इस मदद करता है :)

9

उपयोग इस

SELECT * 
INTO new_table_name 
FROM current_table_name 
+3

ध्यान दें कि यह केवल एक नई तालिका बनाते समय ही काम करेगा। अर्थात। यह बैकअप की तरह काम करता है। यह बयान से स्पष्ट प्रतीत हो सकता है, लेकिन मैं दोहराना चाहता था। और धन्यवाद! यह उपयोगी था :) – Shrout1

+0

आपको इस क्वेरी में बनाने की आवश्यकता नहीं है, यह सम्मिलित करने के साथ-साथ नई तालिका भी बनाता है xameeramir

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