2012-03-05 26 views
15

निर्दिष्ट किए बिना तालिका में सम्मिलित करें हमारे डीबी में एक सारणी है जिसमें 80 से अधिक कॉलम हैं। इसकी प्राथमिक कुंजी है और पहचान सम्मिलन चालू है। मैं इस तालिका में प्रत्येक कॉलम EXCEPT एक अलग तालिका में एक समान तालिका से प्राथमिक कुंजी कॉलम डालने का तरीका ढूंढ रहा हूं।टी-एसक्यूएल प्रत्येक कॉलम

क्या यह संभव है?

+1

आपको कॉलम निर्दिष्ट करने की आवश्यकता है ... – JNK

+0

आलसी प्रोग्रामिंग के मामले की तरह लगता है। यदि आप तालिका के नाम पर राइट क्लिक करते हैं, तो आप "स्क्रिप्ट के रूप में -> सम्मिलित करें" कर सकते हैं, और सभी गैर-पहचान कॉलम आपके लिए लिखे जाएंगे। Shazam। –

+0

योओयू लंबे समय तक डेटाबेस प्रदर्शन को लाभान्वित नहीं होना चाहिए। आपने गुच्छा के सबसे बुरे जवाब को स्वीकार कर लिया है क्योंकि यह हर बार काम को दोगुना करता है जब यह सही क्वेरी लेता है और सब कुछ खुद को बचाने के लिए होता है। – HLGEM

उत्तर

40

आप काफी आसानी से वास्तव में यह कर सकते हैं:

-- Select everything into temp table 
Select * Into 
    #tmpBigTable 
    From [YourBigTable] 

-- Drop the Primary Key Column from the temp table 
Alter Table #tmpBigTable Drop Column [PrimaryKeyColumn] 

-- Insert that into your other big table 
Insert Into [YourOtherBigTable] 
    Select * From #tmpBigTable 

-- Drop the temp table you created 
Drop Table #tmpBigTable 

बशर्ते आप "YourOtherBigTable" में पहचान सम्मिलित पर है और स्तंभों बिल्कुल समान आप ठीक हो जाएगा रहे हैं।

+3

चयन * एक एंटीपाटरन है। कॉलम के साथ सम्मिलित रूप से लिखने से सर्वर के लिए यह अधिक काम करता है। यह एक बहुत बुरा समाधान है। ऑब्जेक्ट tbrowser से स्तंभों को खींचने के दस सेकंड को बचाने के लिए आप एक प्रदर्शन गड़बड़ कर रहे हैं। यह एक पेशेवर के लिए एक अस्वीकार्य अभ्यास है। – HLGEM

+1

यह भी मत भूलना कि इस मामले में आप पूरी तालिका को अस्थायी तालिका में कॉपी कर रहे हैं। यदि आपके पास केवल कुछ पंक्तियां हैं तो यह काम कर सकती है, लेकिन यह वास्तव में बहुत सारी पंक्तियों वाली तालिका के लिए सिस्टम को दबा सकती है। @HLGEM द्वारा पहले से दिए गए कारणों के लिए – Kibbee

+1

-1। –

2

आप सभी कॉलम की सूची प्राप्त करने के लिए सूचना_Schema से पूछ सकते हैं और प्रोग्रामेटिक रूप से अपनी क्वेरी के कॉलम नाम जेनरेट कर सकते हैं। यदि आप यह सब टी-एसक्यूएल में कर रहे हैं तो यह बोझिल होगा, लेकिन यह किया जा सकता है। यदि आप कुछ अन्य क्लाइंट भाषा का उपयोग कर रहे हैं, जैसे सी # ऑपरेशन करने के लिए, यह थोड़ा कम बोझिल होगा।

2

नहीं, यह संभव नहीं है। आप

INSERT INTO MyLargeTable SELECT * FROM OtherTable 

लेकिन यह काम नहीं करेगा, क्योंकि आपका पहचान कॉलम * में शामिल किया जाएगा।

आप

SET IDENTITY_INSERT MyLargeTable ON 
INSERT INTO MyLargeTable SELECT * FROM OtherTable 
SET IDENTITY_INSERT MyLargeTable OFF 

पहले आप डालने सक्षम पहचान मूल्यों इस्तेमाल कर सकते हैं, की तुलना में आप रिकॉर्ड की प्रतिलिपि, तो आप पहचान स्तंभ फिर से सक्षम करें।

लेकिन यह न तो काम करेगा। SQL सर्वर इस मामले में * स्वीकार नहीं करेगा। आपको स्क्रिप्ट में आईडी को स्पष्ट रूप से शामिल करना होगा, जैसे:

SET IDENTITY_INSERT MyLargeTable ON 
INSERT INTO MyLargeTable (Id, co1, col2, ...., col80) SELECT Id, co1, col2, ...., col80 FROM OtherTable 
SET IDENTITY_INSERT MyLargeTable OFF 

तो हम जहां से हमने शुरू किया है, हम वापस आ गए हैं।

प्रबंधन स्टूडियो में तालिका पर राइट क्लिक करने का सबसे आसान तरीका है, इसे INSERT उत्पन्न करें और स्क्रिप्ट चुनें, और उन्हें एक साथ काम करने के लिए थोड़ा सा संपादित करें।

0

असल में, ईमानदारी से ऑब्जेक्ट ब्राउज़र से सभी कॉलम खींचने में दस सेकंड या उससे कम समय लगता है और फिर सूची से पहचान कॉलम हटा देता है। किसी भी चीज़ के लिए चुनिंदा * का उपयोग करना एक त्वरित विचार है लेकिन त्वरित विज्ञापन प्रश्न है।

+2

लेकिन क्या होगा यदि ओपी एक त्वरित विज्ञापन है?;) – onedaywhen

+0

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

+0

आपको हर बार क्वेरी को अपडेट करना चाहिए क्योंकि आपको नए कॉलम की आवश्यकता नहीं हो सकती है। यह कुछ और करने के लिए गैर जिम्मेदार है। आप उन उपयोगकर्ताओं के फ़ील्ड को दिखा सकते हैं जिन्हें वे न केवल परवाह करते हैं बल्कि देखना चाहिए। या आप उन प्रविष्टियों के साथ समाप्त हो सकते हैं जो गलत कॉलम में डेटा डालते हैं क्योंकि किसी ने एक तालिका में कॉलम ऑर्डर बदल दिया है, लेकिन दूसरे या आवेषण जो टूटते हैं क्योंकि एक नया कॉलम उस तालिका में नहीं जोड़ा गया था जो किसी चयन से डेटा ले रहा है। आपको नए कॉलम के अपडेट भी समायोजित करने की आवश्यकता हो सकती है। आपको यह पता लगाने की आवश्यकता हो सकती है कि आवेषण के लिए आंतरिक डेटा क्या होगा। – HLGEM

-1

एक संबंधित सवाल (SELECT * EXCEPT), मैं सच में संबंधपरक भाषा Tutorial D अनुमति देता प्रक्षेपण विशेषताओं के रूप में व्यक्त किए जाने जैसे रखा जाना लोगों के बजाय हटा दिया जाना चाहिए का कहना है के जवाब में

my_relvar { ALL BUT description } 

हालांकि इसकी INSERT वाक्य रचना शामिल करने के लिए टपल मूल्य कंस्ट्रक्टर्स की आवश्यकता नाम/मान युग्म जैसे गुण

INSERT P 
    RELATION 
    { 
     TUPLE { PNO PNO ('P1') , PNAME CHARACTER ('Nut') }, 
     TUPLE { PNO PNO ('P2') , PNAME CHARACTER ('Bolt') } 
    }; 
बेशक

, इस वाक्य रचना का उपयोग कर कोई स्तंभ आदेश (क्योंकि यह वास्तव में रिलेशनल है!) है जैसे

INSERT P 
    RELATION 
    { 
     TUPLE { PNO PNO ('P1') , PNAME CHARACTER ('Nut') }, 
     TUPLE { PNAME CHARACTER ('Bolt') , PNO PNO ('P2') } 
    }; 

वैकल्पिक विशेषता आदेश है, जो एसक्यूएल आंशिक रूप से उदा करता है पर पूरी तरह भरोसा करने के लिए किया जाएगा: यह अर्थ की दृष्टि से बराबर है

INSERT INTO P (PNO , PNAME) 
    VALUES   
     (PNO ('P1') , CAST ('Nut' AS VARCHAR (20))) , 
     (PNO ('P2') , CAST ('Bolt' AS VARCHAR (20))); 

एक बार स्तंभों की commalist निर्दिष्ट किया गया है VALUES पंक्ति कंस्ट्रक्टर्स इस आदेश है, जो आदर्श नहीं है बनाए रखने के लिए है: यह ऊपर करने के लिए एक करीबी एसक्यूएल बराबर है। लेकिन कम से कम आदेश निर्दिष्ट किया गया है: आपका प्रस्ताव कुछ डिफ़ॉल्ट आदेश पर भरोसा करेगा जो संभवतः गैर-निर्धारक हो सकता है।

3
CREATE TABLE Tests 
(
    TestID int IDENTITY PRIMARY KEY, 
    A int, 
    B int, 
    C int 
) 

INSERT INTO dbo.Tests 
VALUES (1,2,3) 

SELECT * FROM Tests 

यह SQL2012

1

में काम करता है क्यों नहीं बस, मूल डेटा का दृश्य बनाने के अवांछित क्षेत्रों को हटाने? फिर 'अपने दिल की इच्छा में' चुनें '।

    एक ही दृश्य
  • क्षेत्रों जोड़ें/परिवर्तन/हटाने के लिए आसान
  • मेटा डेटा
  • कोई अस्थायी तालिकाओं
क्वेरी करने के लिए कोई ज़रूरत नहीं संशोधित करने के लिए sproc कोई ज़रूरत नहीं के भीतर
  • स्थानीयकृत नियंत्रण
  • +0

    एक दृश्य का उपयोग कर हानिकारक बनाम अस्थायी तालिकाओं को क्यों बना रहा है? मैं इस दावे पर सवाल नहीं उठा रहा हूं, सिर्फ कारण के बारे में सोच रहा हूं। –

    +0

    टीईएमपी तालिका (मई) बड़ी मात्रा में मेमोरी/डिस्क का उपयोग कर सकती है, जहां दृश्य मूल रूप से उत्पादन तालिका को आपके इच्छित फ़ील्ड में फ़िल्टर कर रहा है। यह विधि तेज प्रदर्शन करेगी, कोई लंबे समय तक चलने वाला ओवरहेड नहीं होगा और वांछित के रूप में बदला जा सकता है। – davidWazy

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