कथन के “INSERT INTO…” भाग को दोहराए बिना कई पंक्तियाँ डालें?


536

मुझे पता है कि मैंने इसे सालों पहले किया है, लेकिन मैं सिंटैक्स को याद नहीं कर सकता हूं, और "थोक आयात" के बारे में डॉक्स और लेखों को खींचने के कारण मैं इसे कहीं भी नहीं पा सकता हूं।

यहाँ मैं क्या करना चाहता हूँ, लेकिन वाक्यविन्यास बिल्कुल सही नहीं है ... कृपया, कोई ऐसा व्यक्ति जिसने पहले ऐसा किया हो, मेरी मदद करें :)

INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
    (124, 'Jonny'),
    (125, 'Sally')

मुझे पता है कि यह सही सिंटैक्स के करीब है। मुझे "BULK" शब्द की आवश्यकता हो सकती है, या कुछ और, मुझे याद नहीं है। कोई उपाय?

मुझे SQL Server 2005 डेटाबेस के लिए इसकी आवश्यकता है। मैंने इस कोड की कोशिश की है, कोई फायदा नहीं हुआ:

DECLARE @blah TABLE
(
    ID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(100) NOT NULL
)

INSERT INTO @blah (ID, Name)
    VALUES (123, 'Timmy')
    VALUES (124, 'Jonny')
    VALUES (125, 'Sally')

SELECT * FROM @blah

मैं ला रहा हूँ Incorrect syntax near the keyword 'VALUES'.


4
आपका उपरोक्त कोड ठीक है, बस जोड़ने की जरूरत है ',' मान कथन के बाद
sam

4
INSERT INTO @blah (ID, नाम), VALUES (123, 'टिम्मी'), VALUES (124, 'जॉनी'), VALUES (125, 'सैली')
sam

1
बस एक सावधानी: आप केवल इस विधि से 1000 पंक्तियों तक सम्मिलित कर सकते हैं। INSERT INTO #Test (LWPurchaseOrderID) VALUES (935791), (935933)
अनूप वर्मा

16
2005 अब समर्थित नहीं है। २०० you, २०१२ और २०१६ के लिए आप लगभग वही उपयोग कर सकते हैं जो आप INSERT INTO @blah (ID, Name) VALUES (123, 'Timmy'), (124, 'Jonny'), (125, 'Sally') "वैल्यू" में रखते हैं, केवल एक बार दिखाई देता है और आपको सेट के बीच अल्पविराम की आवश्यकता होती है।
जे। क्रिस कोम्पटन

जवाबों:


328
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'

SQL सर्वर 2008 के लिए, यह आपके प्रश्न में कथन के अनुसार ठीक एक खंड में कर सकता है (आपको प्रत्येक मान कथन को अलग करने के लिए अल्पविराम जोड़ने की आवश्यकता है) ...


10
क्या यह कई INSERT बयानों का उपयोग करने से अधिक कुशल है?
कोड कमांडर

7
@ कोड कमांडर: नहीं, इसमें संकलन करना अधिक लंबा है। हां, इसमें आपके पास केवल एक प्रविष्टि है। लेकिन यह इस सवाल का जवाब देता है: INSERT table (columnlist)
gbn

3
@VoidKing मुझे पता है कि यह आधे साल बाद आता है और आप इसे बहुत पहले ही समझ सकते हैं, लेकिन यह वास्तव में काफी सरल है। उपयोग करके selectआप स्तंभों और पंक्तियों के साथ एक सेट बनाते हैं, और डिज़ाइन द्वारा इन पंक्तियों insertको स्तंभों की समान मात्रा के साथ किसी अन्य तालिका में संपादित किया जा सकता है । तुम भी शाब्दिक और मूल्यों के मिश्रण का उपयोग कर सकते हैं। उदाहरण के लिए, हर बार पहले कॉलम में 'ए' के insertसाथ प्रयोग select 'A', ID from ATableकरना और दूसरे कॉलम में एटीएबल की संबंधित पंक्ति के आईडी कॉलम का मूल्य।
मारियोड्स

1
यह DB2 के साथ भी काम करता है जो कि पुरानी तकनीक में फंसे लोगों के लिए एक महत्वपूर्ण संकेत है। SQL Server 2008 या नए में काम करने वाले लोगों के लिए अल्पविराम द्वारा दिए गए मान मेरे उत्तर से बेहतर हैं। ओपी पहले को छोड़कर सभी "मूल्यों" को हटाने और एक साथ जगह ले सकता है,
JPK

1
@PRMan आप SQL Server 2008 संस्करण के बाद ऐसा नहीं करेंगे। जैसा कि उल्लेख किया गया है ...
gbn

510

आपका सिंटैक्स SQL ​​Server 2008 में लगभग काम करता है (लेकिन SQL Server 2005 1 में नहीं ):

CREATE TABLE MyTable (id int, name char(10));

INSERT INTO MyTable (id, name) VALUES (1, 'Bob'), (2, 'Peter'), (3, 'Joe');

SELECT * FROM MyTable;

id |  name
---+---------
1  |  Bob       
2  |  Peter     
3  |  Joe       

1 जब प्रश्न का उत्तर दिया गया था, तो यह स्पष्ट नहीं किया गया था कि प्रश्न SQL Server 2005 का उल्लेख कर रहा था। मैं इस उत्तर को यहां छोड़ रहा हूं, क्योंकि मेरा मानना ​​है कि यह अभी भी प्रासंगिक है।


SQL सर्वर 2012 में काम करता है
user2601995

27
सर्वर 2008 इस तरह से 1000 से अधिक पंक्तियों को डालने की अनुमति नहीं देता है।
माइकल - जहां का क्ले शिर्क

1
क्या होता है, अगर एक मूल्य सेट दोषपूर्ण है? क्या सभी आवेषण वापस लुढ़क जाएंगे या सिर्फ दोषपूर्ण पंक्ति होगी?
netblognet

2
@netblognet मैंने अभी परीक्षण किया है कि केवल दोषपूर्ण पंक्तियों को नहीं डाला गया है (बाकी सभी सही ढंग से डाली गई हैं)
मौरिसियो ग्रेसिया


243

यदि आपका डेटा आपके डेटाबेस में पहले से है तो आप निम्न कार्य कर सकते हैं:

INSERT INTO MyTable(ID, Name)
SELECT ID, NAME FROM OtherTable

यदि आपको डेटा को हार्ड कोड करने की आवश्यकता है तो SQL 2008 और बाद के संस्करण आपको निम्न कार्य करने देंगे ...

INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)

28

डैनियल वेसलो के जवाब INSERT INTO ... VALUESमें वाक्यविन्यास का उपयोग करना एक कष्टप्रद सीमा है:

से MSDN

VALUES सूची में सीधे पंक्तियों को सम्मिलित करके अधिकतम पंक्तियों का निर्माण किया जा सकता है जो 1000 है

इस सीमा को छोड़ने का सबसे आसान तरीका है कि व्युत्पन्न तालिका का उपयोग करें:

INSERT INTO dbo.Mytable(ID, Name)
SELECT ID, Name 
FROM (
   VALUES (1, 'a'),
          (2, 'b'),
          --...
          -- more than 1000 rows
)sub (ID, Name);

LiveDemo


यह SQL Server 2008+ से शुरू होगा


क्या मेरे पास इस 'उप' वाक्यविन्यास के बारे में एक लेख का लिंक हो सकता है।
कोडकम्पर

2
@CodeCamper docs.microsoft.com/en-us/sql/t-sql/queries/… सेक्शन:C. Specifying multiple values as a derived table in a FROM clause
Lukasz Szozda

3
इस उत्तर का लाभ यह है कि यह उन्हें दोहराए बिना समान मूल्यों को निर्दिष्ट करने का एक तरीका प्रदान करता है (जो कि मैं देख रहा था)। उदाहरण के लिए, तीसरा कॉलम जो समान है, आपको उसे हजार बार दोहराने की आवश्यकता नहीं होगी।
वादिम बर्मन

1
@VadimBerman हां, यह अच्छा परिदृश्य है जब टेबल पर कोई डिफ़ॉल्ट परिभाषित नहीं है।
लुकाज़ सजोज़ा

14

आप ऐसा कर सकते हैं (बदसूरत लेकिन यह काम करता है):

INSERT INTO dbo.MyTable (ID, Name) 
select * from
(
 select 123, 'Timmy'
  union all
 select 124, 'Jonny' 
  union all
 select 125, 'Sally'
 ...
) x

10

यह आप के बारे में क्या पूछ रहे हैं प्राप्त होगा:

INSERT INTO table1 (ID, Name)
    VALUES (123, 'Timmy'), 
           (124, 'Jonny'), 
           (125, 'Sally');

भविष्य के डेवलपर्स के लिए, आप दूसरी तालिका से भी सम्मिलित कर सकते हैं :

INSERT INTO table1 (ID, Name)
    SELECT 
         ID, 
         Name 
    FROM table2

या यहां तक कि कई तालिकाओं से :

INSERT INTO table1 (column2, column3)
    SELECT 
         t2.column, 
         t3.column
    FROM table2 t2
         INNER JOIN table3 t3
         ON t2.ID = t3.ID

8

आप एक संघ का उपयोग कर सकते हैं:

INSERT INTO dbo.MyTable (ID, Name) 
SELECT ID, Name FROM (
    SELECT 123, 'Timmy'
    UNION ALL
    SELECT 124, 'Jonny'
    UNION ALL
    SELECT 125, 'Sally'
) AS X (ID, Name)

6

यह SQL Server 2008 के लिए ठीक दिखता है। SS2005 और इससे पहले के लिए, आपको VALUES स्टेटमेंट को दोहराना होगा।

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
VALUES (124, 'Jonny')   
VALUES (125, 'Sally')  

संपादित करें :: मेरा बुरा। आपको SS2005 में प्रत्येक पंक्ति के लिए 'INSERT INTO' दोहराना होगा।

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (124, 'Jonny')   
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (125, 'Sally')  

6

कई पंक्तियों को सम्मिलित करने के लिए SQL सर्वर में XML का उपयोग करना आसान होगा अन्यथा यह बहुत थकाऊ हो जाता है।

कोड स्पष्टीकरण के साथ पूरा लेख यहां देखें

नमूना देखने के लिए sql सर्वर में निम्न कोड की प्रतिलिपि बनाएँ।

declare @test nvarchar(max)

set @test = '<topic><dialog id="1" answerId="41">
        <comment>comment 1</comment>
        </dialog>
    <dialog id="2" answerId="42" >
    <comment>comment 2</comment>
        </dialog>
    <dialog id="3" answerId="43" >
    <comment>comment 3</comment>
        </dialog>
    </topic>'

declare @testxml xml
set @testxml = cast(@test as xml)
declare @answerTemp Table(dialogid int, answerid int, comment varchar(1000))

insert @answerTemp
SELECT  ParamValues.ID.value('@id','int') ,
ParamValues.ID.value('@answerId','int') ,
ParamValues.ID.value('(comment)[1]','VARCHAR(1000)')
FROM @testxml.nodes('topic/dialog') as ParamValues(ID)

6
USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
UNION ALL
SELECT 'Fourth' ,4
UNION ALL
SELECT 'Fifth' ,5
GO

या आप किसी भी दिन का उपयोग कर सकते हैं

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES 
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)

6

मैं निम्नलिखित का उपयोग कर रहा हूं:

INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10

यह आईडी और नाम के लिए अद्वितीय GUIDs के साथ दस पंक्तियों को जोड़ देगा।

नोट: अंतिम पंक्ति (GO 10) को '?' क्योंकि यह त्रुटि फेंक देगा: एक घातक स्क्रिप्टिंग त्रुटि हुई। GO को पार्स करते समय गलत सिंटैक्स का सामना करना पड़ा।


5

INSERT (Transact-SQL) (SQL Server 2005) के अनुरूप आप INSERT INTO dbo.Blahइसे हर बार निर्दिष्ट नहीं कर सकते हैं या किसी अन्य सिंटैक्स / दृष्टिकोण का उपयोग कर सकते हैं,


2

यह SQL में बहुत तेजी से और कुशल काम कर रहा है। मान लीजिए आपके पास टेबल है Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50)

CREATE TABLE [dbo].[Sample](
[a] [int] NULL,
[b] [int] NULL,
[c] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[D] [int] NULL
)

तो आप सम्मिलित विवरण को दोहराए बिना निम्नलिखित क्वेरी का उपयोग करते हुए इस तालिका में कई रिकॉर्ड को इनसेट नहीं कर सकते,

DECLARE @LIST VARCHAR(MAX)
SET @LIST='SELECT 1, 1, ''Charan Ghate'',11
     SELECT 2,2, ''Mahesh More'',12
     SELECT 3,3,''Mahesh Nikam'',13
     SELECT 4,4, ''Jay Kadam'',14'
INSERT SAMPLE (a, b, c,d) EXEC(@LIST)

इसके अलावा सी # का उपयोग करके SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

आप एक बार में 10 पंक्तियाँ सम्मिलित कर सकते हैं

   DataTable dt = new DataTable();
        dt.Columns.Add("a");
        dt.Columns.Add("b");
        dt.Columns.Add("c");
        dt.Columns.Add("d");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dt.NewRow();
            dr["a"] = 1;
            dr["b"] = 2;
            dr["c"] = "Charan";
            dr["d"] = 4;
            dt.Rows.Add(dr);
        }
        SqlConnection con = new SqlConnection("Connection String");
        using (SqlBulkCopy bulkcopy = new SqlBulkCopy(con))
        {
            con.Open();
            bulkcopy.DestinationTableName = "Sample";
            bulkcopy.WriteToServer(dt);
            con.Close();
        }

0

Oracle SQL Server एकाधिक पंक्तियाँ सम्मिलित करें

एक मल्टीटेबल इंसर्ट में, आप एक सबक्वेरी के मूल्यांकन से लौटी पंक्तियों से निकाली गई गणना की गई पंक्तियों को एक या अधिक तालिकाओं में सम्मिलित करते हैं।

बिना शर्त INSERT ALL : - एक बार में कई पंक्तियों को एक तालिका में जोड़ने के लिए, आप INSERT विवरण के निम्नलिखित रूप का उपयोग करते हैं:

INSERT ALL
   INTO table_name (column_list) VALUES (value_list_1)
   INTO table_name (column_list) VALUES (value_list_2)
   INTO table_name (column_list) VALUES (value_list_3)
   ...
   INTO table_name (column_list) VALUES (value_list_n)
SELECT 1 FROM DUAL; -- SubQuery

एक बिना शर्त मल्टीफ़ॉर्म डालने के लिए कई इन्सर्ट_इंटो_क्लॉस के बाद सभी को निर्दिष्ट करें। ऑरेकल डेटाबेस उपकुंजियों द्वारा लौटाए गए प्रत्येक पंक्ति के लिए एक बार प्रत्येक insert_into_clause को निष्पादित करता है।

MySQL सर्वर कई पंक्तियों को सम्मिलित करें

INSERT INTO table_name (column_list)
VALUES
    (value_list_1),
    (value_list_2),
    ...
    (value_list_n);

एकल पंक्ति क्वेरी सम्मिलित करें

INSERT INTO table_name (col1,col2) VALUES(val1,val2);

0

अन्य लोगों ने यहां कुछ मल्टी-रिकॉर्ड सिंटैक्स सुझाए हैं। उस पर विस्तार से, मेरा सुझाव है कि आप पहले एक अस्थायी तालिका में डालें, और वहां से अपनी मुख्य तालिका डालें।

इसका कारण क्वेरी से डेटा लोड करना अधिक समय लग सकता है, और आप तालिका या पृष्ठों को ज़रूरत से ज़्यादा समय तक लॉक कर सकते हैं, जो उस तालिका के विरुद्ध चल रहे अन्य प्रश्नों को धीमा कर देता है ।

-- Make a temp table with the needed columns
select top 0 *
into #temp
from MyTable (nolock)

-- load data into it at your leisure (nobody else is waiting for this table or these pages)
insert #temp (ID, Name)
values (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally')

-- Now that all the data is in SQL, copy it over to the real table. This runs much faster in most cases.
insert MyTable (ID, Name)
select ID, Name
from #temp

-- cleanup
drop table #temp

इसके अलावा, आपकी आईडी की पहचान शायद (1,1) होनी चाहिए और शायद आपको परिस्थितियों के विशाल हिस्से में उन्हें सम्मिलित नहीं करना चाहिए। SQL आपके लिए वह सामान तय करता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.