SQL सर्वर मौजूदा तालिका में चयन करें


384

मैं एक तालिका से कुछ फ़ील्ड का चयन करने और उन्हें संग्रहीत कार्यविधि से मौजूदा तालिका में सम्मिलित करने का प्रयास कर रहा हूं। यहाँ मैं कोशिश कर रहा हूँ:

SELECT col1, col2
INTO dbo.TableTwo 
FROM dbo.TableOne 
WHERE col3 LIKE @search_key

मुझे लगता SELECT ... INTO ...है कि अस्थायी तालिकाओं के लिए है, यही वजह है कि मुझे एक त्रुटि मिलती है जो dbo.TableTwoपहले से मौजूद है।

मैं कैसे से कई पंक्तियों सम्मिलित कर सकते हैं dbo.TableOneमें dbo.TableTwo?


29
चूंकि आपने पहले ही एक उत्तर स्वीकार कर लिया है, मैं सिर्फ एक नोट देना चाहता था: चयन करें "अस्थायी तालिकाओं के लिए" नहीं है, यह क्वेरी के चुनिंदा हिस्से की संरचना (और डेटा) के आधार पर एक नई तालिका बनाने के लिए है। । एक तालिका X के लिए, आप कभी भी इसे अधिकतम 1 बार * में चुन सकते हैं, इसके बाद आपको किसी भी डेटा को जोड़ने के लिए इन्सर्ट इनो का उपयोग करने की आवश्यकता है। * यदि तालिका पहले से मौजूद है, तो शून्य बार। यह निश्चित रूप से है जब तक आप पहले तालिका को ड्रॉप नहीं करते हैं।
गुलाबीफ्लोक्स 3333

8
लेकिन ध्यान दें कि इन्टो का चयन करें इंडेक्स / प्राइमरी की / फॉरेन की कमी को कॉपी नहीं करता है, इसलिए यह आपको एक अनइन्डेक्स हीप-ओ-डेटा के साथ छोड़ देता है। यह त्वरित देव कार्य के लिए उपयोगी है, लेकिन वास्तविक उत्पादन तालिका को जोड़ने / स्थानांतरित करने का तरीका नहीं है।
ग्राहम ग्रिफिथ्स

बस इस स्टेटमेंट को चलाएं 'ड्रॉप टेबल टैब्लेट;' और क्वेरी से ऊपर चलाएं। चुनें ... अस्थायी तालिकाओं के लिए नहीं है।
शिवांगिनी

जवाबों:


637

SELECT ... INTO ... केवल तब काम करता है जब INTO क्लॉज में निर्दिष्ट तालिका मौजूद नहीं है - अन्यथा, आपको उपयोग करना होगा:

INSERT INTO dbo.TABLETWO
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key

यह मानता है कि dbo.TABLETWO में केवल दो कॉलम हैं - आपको अन्यथा कॉलम निर्दिष्ट करने की आवश्यकता है:

INSERT INTO dbo.TABLETWO
  (col1, col2)
SELECT col1, col2
  FROM dbo.TABLEONE
 WHERE col3 LIKE @search_key

52
यह सबसे अच्छा अभ्यास है कि कॉलम को हमेशा निर्दिष्ट करें चाहे वे सभी वहां हों या नहीं। यह चीजों को तोड़ने से रोकने में मदद करेगा जब कोई स्तंभ जोड़ता है।
HLGEM

1
हम्म, SELECT... INTO...यदि INTOखंड में निर्दिष्ट तालिका पहले से मौजूद नहीं है , तो कथन काम नहीं करता है। मुझे "अघोषित चर" त्रुटि मिल रही है। हालांकि शायद यह मुद्दा केवल MySQL के लिए है। CREATE TABLE ... LIKE .. worked;
लेज़रशेक्स

1
@Gnuey का चयन करें ... INTO ... केवल तभी काम करता है जब कोई मौजूदा तालिका हो। कोई मौजूदा तालिका नहीं है, मूल रूप से पोस्ट के प्रारूप का उपयोग करें (है कि एक नया टेबल बना देंगे)
विल

6
@ क्या आपने जो कहा उसके विपरीत का मतलब है? ASELECT ... INTO ... while को निर्दिष्ट करने के लिए एक गैर-मौजूदा तालिका की आवश्यकता होती है, जबकि SINSERT INTO ...। को निर्दिष्ट करने के लिए एक मौजूदा तालिका की आवश्यकता होती है।
एंड्रे सी। एंडरसन

5
काश, मैं कितनी बार वापस जाँच करूं और इस उत्तर का उपयोग करूं, इसके लिए एक काउंटर था!
MTAdmin

13

एक तालिका से दूसरी तालिका में डेटा सम्मिलित करने के दो अलग-अलग तरीके हैं।

मौजूदा तालिका के लिए - सम्मिलित करें का चयन करें

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

----Create testable
CREATE TABLE TestTable (FirstName VARCHAR(100), LastName VARCHAR(100))
----INSERT INTO TestTable using SELECT
INSERT INTO TestTable (FirstName, LastName)
SELECT FirstName, LastName
FROM Person.Contact
WHERE EmailPromotion = 2
----Verify that Data in TestTable
SELECT FirstName, LastName
FROM TestTable
----Clean Up Database
DROP TABLE TestTable

गैर-मौजूदा तालिका के लिए - चयन करें

इस पद्धति का उपयोग तब किया जाता है जब तालिका पहले नहीं बनाई जाती है और इसे तब बनाना पड़ता है जब एक तालिका से डेटा को किसी अन्य तालिका में नई बनाई गई तालिका में सम्मिलित करना होता है। नई तालिका चयनित कॉलम के समान डेटा प्रकारों के साथ बनाई गई है।

----Create a new table and insert into table using SELECT INSERT
SELECT FirstName, LastName
INTO TestTable
FROM Person.Contact
WHERE EmailPromotion = 2
----Verify that Data in TestTable
SELECT FirstName, LastName
FROM TestTable
----Clean Up Database
DROP TABLE TestTable

रेफ


3

यह नीचे दिए गए अनुसार काम करेगा:

insert into Gengl_Del Select Tdate,DocNo,Book,GlCode,OpGlcode,Amt,Narration 
from Gengl where BOOK='" & lblBook.Caption & "' AND DocNO=" & txtVno.Text & ""

5
+1 का प्रतिकार करने के लिए -1 और उन विचारों को देने वाले प्रयास के लिए जिनका उपयोग किया जा सकता है या अन्य उपयोगकर्ताओं द्वारा संदर्भित किया जा सकता है। @MarkSowul SQL इंजेक्शन के लिए सही है लेकिन शैक्षणिक उद्देश्यों के लिए अन्य लोग उस तरह की विधि का प्रयास कर सकते हैं।
अल्बर्ट लॉर

1
अधिकांश तालिकाओं में एक ऑटो वेतन वृद्धि फ़ील्ड होती है, जिसे सम्मिलित नहीं किया जा सकता है। तो SELECT *काम नहीं करेगा। यह एक बेहतर तरीका है, धन्यवाद!
MJH

2
@ User6675636b20796f7521 मैं अन्य लोगों के लिए "ठीक" यह सुझाव देने के लिए इतनी दूर नहीं जाऊंगा कि उस तरह का तरीका आजमाया जाए, अगर यह SQL इंजेक्शन है जिसके बारे में हम बात कर रहे हैं। यह कभी नहीं किया जाना चाहिए, और इस तरह कभी भी कोशिश नहीं की जानी चाहिए। शुरुआत से ही ऐसा करने का सही तरीका दिखाते हुए इस उत्तर को संपादित करना कहीं अधिक उत्पादक होगा , और यदि कोई पूछता है, "प्रश्न चिह्नों / प्रतीकों में क्या है?" आप बस जवाब देते हैं, "वे पैरामीटर पैरामीटर हैं जो पैरामीटर में क्वेरीज़ (स्कोप से बाहर) के उपयोग के लिए हैं" और उन्हें वहां से निकालने दें।
मैट बोर्जा

2
select *
into existing table database..existingtable
from database..othertables....

यदि आपने select * into tablename from other tablenamesपहले, अगली बार, अपेंड करने के लिए उपयोग किया है, तो आप कहते हैंselect * into existing table tablename from other tablenames


2
PS ने SYBASE ASE 15.5 पर परीक्षण किया
Verena_Techie

10
ओपी एमएस SQL ​​के लिए पूछ रहा है।
ग्रैंडमास्टरफ्लश

1

यदि गंतव्य तालिका मौजूद है, लेकिन आप स्तंभ नाम निर्दिष्ट नहीं करना चाहते:

DECLARE @COLUMN_LIST NVARCHAR(MAX);
DECLARE @SQL_INSERT NVARCHAR(MAX);

SET @COLUMN_LIST = (SELECT DISTINCT
    SUBSTRING(
        (
            SELECT ', table1.' + SYSCOL1.name  AS [text()]
            FROM sys.columns SYSCOL1
            WHERE SYSCOL1.object_id = SYSCOL2.object_id and SYSCOL1.is_identity <> 1
            ORDER BY SYSCOL1.object_id
            FOR XML PATH ('')
        ), 2, 1000)
FROM
    sys.columns SYSCOL2
WHERE
    SYSCOL2.object_id = object_id('dbo.TableOne') )

SET @SQL_INSERT =  'INSERT INTO dbo.TableTwo SELECT ' + @COLUMN_LIST + ' FROM dbo.TableOne table1 WHERE col3 LIKE ' + @search_key
EXEC sp_executesql @SQL_INSERT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.