বিবৃতিটির "INSERT INTO…" অংশটি পুনরাবৃত্তি করে একাধিক সারি Inোকান?


536

আমি জানি আমি বহু বছর আগে এটি করেছি, তবে সিনট্যাক্সটি মনে করতে পারছি না এবং "বাল্ক আমদানি" সম্পর্কে প্রচুর সহায়তা ডক্স এবং নিবন্ধগুলি টানানোর কারণে আমি এটি কোথাও খুঁজে পাই না।

আমি যা করতে চাই তা এখানে, তবে বাক্য গঠনটি ঠিক ঠিক নয় ... দয়া করে, যে কেউ আগে এটি করেছে, আমাকে সাহায্য করুন :)

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

আমি জানি যে এই হল ঘনিষ্ঠ অধিকার সিনট্যাক্স করতে। আমার সেখানে "বাল্ক" শব্দটির দরকার হতে পারে বা অন্য কোনও কিছু মনে থাকতে পারে না। কোন ধারণা?

এসকিউএল সার্ভার 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
আপনার উপরের কোডটি ঠিক আছে 'মান' স্টেটমেন্টের পরে ',' যোগ করতে হবে
স্যাম

4
@ ব্লাহ (আইডি, নাম), ভ্যালু (123, 'টিমি'), ভ্যালু (124, 'জনি'), ভ্যালু (125, 'স্যালি')
স্যাম

1
কেবলমাত্র একটি সতর্কতা: আপনি কেবল এই পদ্ধতিতে 1000 সারি পর্যন্ত সন্নিবেশ করতে পারেন। INTERT INTO # টেস্ট (LWPurchaseOrderID) ভ্যালু (935791), (935933)
অনুপ ভার্মা

16
2005 আর সমর্থিত নয়। ২০০৮, ২০১২ এবং ২০১ For-এর জন্য আপনি "VALUES" যা রেখেছেন তা প্রায় একবার ব্যবহার করতে পারেন 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'

এসকিউএল সার্ভার 2008 জন্য, মূল্যবোধ ধারা এটা করতে পারেন ঠিক আপনার প্রশ্নে বিবৃতি অনুযায়ী (আপনি শুধু একটি কমা প্রতিটি মান বিবৃতি আলাদা যোগ করতে হবে) ...


10
একাধিক INSERT বিবৃতি ব্যবহারের চেয়ে এটি কি আরও দক্ষ?
কোড কমান্ডার 21

7
@ কোড কমান্ডার: না, এটি সংকলনের জন্য আরও দীর্ঘ। হ্যাঁ, এতে আপনার কেবল একটি inোকানো আছে। কোন পুনরাবৃত্তি করুন: কিন্তু এটা প্রশ্নের উত্তরINSERT table (columnlist)
gbn

3
@ অকার্যকর আমি জানি যে এটি অর্ধ বছর পরে আসে এবং আপনি এটি অনেক আগেই বুঝতে পেরেছিলেন, তবে এটি সত্যিই সহজ। selectআপনি কলাম এবং সারি সহ একটি সেট তৈরি করে এবং নকশার মাধ্যমে এই সারিগুলি insertসমান পরিমাণে কলাম সহ অন্য টেবিলে এডিট করতে পারেন । এমনকি আপনি আক্ষরিক এবং মানগুলির মিশ্রণ ব্যবহার করতে পারেন। উদাহরণস্বরূপ, ব্যবহার insertসঙ্গে select 'A', ID from ATable'এ' প্রথম কলামে যে সময় এবং দ্বিতীয় কলামের ATable সংশ্লিষ্ট সারির আইডি কলাম মান সন্নিবেশ করা হবে।
মারিওডিএস

1
এটি ডিবি 2 এর সাথেও কাজ করে যা আমাদের মধ্যে পুরানো প্রযুক্তিতে আটকে থাকা একটি গুরুত্বপূর্ণ সিডেনোট। কমা প্রশ্নের উত্তরের দ্বারা পৃথক করা মানগুলি আপনার মধ্যে যারা এসকিউএল সার্ভারে কাজ করছে 2008 বা তার থেকেও নতুন এটি আমার মতে ভাল। ওপি প্রথমটি বাদ দিয়ে সমস্ত "মান" মুছে ফেলতে এবং একটি দিয়ে প্রতিস্থাপন করতে পারে
জেপিকে

1
@ পিপিএম আপনি সংস্করণ এসকিউএল সার্ভার ২০০৮ এর পরে এমনটি করবেন না mentioned উল্লিখিত হিসাবে ...
জিবিএন ২n

510

তোমার বাক্য গঠন প্রায় SQL সার্ভার 2008 সালে কাজ করে (কিন্তু SQL সার্ভার 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 যখন প্রশ্নের উত্তর দেওয়া হয়েছিল, তখন এটি স্পষ্টভাবে প্রমাণিত হয়নি যে প্রশ্নটি এসকিউএল সার্ভার 2005-এর বিষয়ে উল্লেখ করছে I আমি এই উত্তরটি এখানে রেখে যাচ্ছি, কারণ আমি বিশ্বাস করি এটি এখনও প্রাসঙ্গিক।


এসকিউএল সার্ভারে কাজ করে 2012
ব্যবহারকারী 2601995

27
সার্ভার ২০০৮ এভাবে 1000 টিরও বেশি সারি .োকানোর অনুমতি দেয় না।
মাইকেল - ক্লে শির্কি

1
কি হবে, যদি একটি মান সেট ত্রুটিযুক্ত হয়? সমস্ত সন্নিবেশগুলি ফিরে ঘুরবে বা কেবল ত্রুটিযুক্ত সারিতে?
নেটব্লগনেট

2
@ নেটব্লগনেট আমি কেবল পরীক্ষা করেছি যে কেবল ত্রুটিযুক্ত সারিগুলি sertedোকানো হয়নি (বাকি সমস্তগুলিই সঠিকভাবে সন্নিবেশ করা হয়েছে)
মরিসিও গ্র্যাসিয়া গুটিরেজ

1
এটা তোলে প্রত্যাহার করা যেতে পারে @Michael stackoverflow.com/a/42703601/5070879
Lukasz Szozda

243

যদি আপনার ডেটা আপনার ডাটাবেসে ইতিমধ্যে থাকে তবে আপনি এটি করতে পারেন:

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

আপনার যদি ডেটাটির হার্ড কোড প্রয়োজন হয় তবে এসকিউএল ২০০৮ এবং পরবর্তী সংস্করণগুলি আপনাকে নিম্নলিখিতটি করতে দেয় ...

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

28

ড্যানিয়েল ভ্যাসালো এর উত্তরের INSERT INTO ... VALUESমতো সিনট্যাক্স ব্যবহার করে একটি বিরক্তিকর সীমাবদ্ধতা রয়েছে:

এমএসডিএন থেকে

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


এটি এসকিউএল সার্ভার ২০০৮+ থেকে শুরু করে কাজ করবে


আমি কি এই 'সাব' সিনট্যাক্স সম্পর্কে একটি নিবন্ধের লিঙ্ক পেতে পারি?
ক্যাম্পার

2
@ কোডক্যাম্পার ডকস.মাইক্রোসফটকম / en- us/ sql/ t- sql/ queries/ বিভাগ:C. Specifying multiple values as a derived table in a FROM clause
লুকাশজ সজোদা

3
এই উত্তরের সুবিধাটি হ'ল এটি পুনরাবৃত্তি না করে অভিন্ন মানগুলি নির্দিষ্ট করার একটি উপায় সরবরাহ করে (যা আমি খুঁজছিলাম)। উদাহরণস্বরূপ, তৃতীয় কলাম সহ অভিন্ন, আপনার এটি হাজার বার পুনরুক্ত করার প্রয়োজন হবে না।
ভাদিম বার্মান

1
@ ভাদিমবার্মান হ্যাঁ, টেবিলে কোনও ডিফল্ট সংজ্ঞা না দেওয়া হলে এটি খুব ভাল দৃশ্য।
লুকাশজ সজোদা

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

এটি এসকিউএল সার্ভার ২০০৮-এর জন্য ঠিক আছে SS

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

একাধিক সারি সন্নিবেশ করানোর জন্য এসকিউএল সার্ভারে এক্সএমএল ব্যবহার করা সহজ হবে অন্যথায় এটি খুব ক্লান্তিকর হয়ে ওঠে।

কোড ব্যাখ্যা সহ পূর্ণ নিবন্ধটি এখানে দেখুন

একটি নমুনা দেখতে নিম্নলিখিত কোডটি স্কিএল সার্ভারে অনুলিপি করুন।

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

এটি আইডি এবং নামের জন্য অনন্য জিআইডি সহ দশটি সারি যুক্ত করবে।

দ্রষ্টব্য: ';' দিয়ে শেষ লাইনটি (জিও 10) শেষ করবেন না; কারণ এটি ত্রুটি ছুঁড়ে দেবে: মারাত্মক স্ক্রিপ্টিং ত্রুটি ঘটেছে। জিও পার্স করার সময় ভুল সিনট্যাক্সের মুখোমুখি হয়েছিল।


5

সংশ্লিষ্ট ঢোকান (লেনদেন এসকিউএল) (SQL সার্ভার 2005) আপনি পারেন ফেরত না INSERT INTO dbo.Blahএবং এটি প্রত্যেক সময় নির্দিষ্ট করুন অথবা অন্য সিনট্যাক্স / পদ্ধতির ব্যবহার করতে হবে,


2

এটি এসকিউএল-তে খুব দ্রুত এবং দক্ষতার সাথে কাজ করছে। ধরুন আপনি ছক আছে 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 টি সারি canোকাতে পারেন

   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

ওরাকল এসকিউএল সার্ভার একাধিক সারি .োকান

একটি বহুসংখ্যক সন্নিবেশে, আপনি এক বা একাধিক টেবিলগুলিতে সাবকিউয়ের মূল্যায়ন থেকে ফিরে আসা সারিগুলি থেকে সঞ্চিত গণিত সারিগুলি সন্নিবেশ করান।

শর্তহীন 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_clauses অনুসরণ করে সমস্ত নির্দিষ্ট করুন। ওরাকল ডেটাবেস সাবউয়েরি দ্বারা প্রত্যাবর্তিত প্রতিটি সারির জন্য একবার প্রতিটি insert_into_clause চালায়।

মাইএসকিউএল সার্ভার একাধিক সারি .োকান

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) হওয়া উচিত এবং আপনার সম্ভবত এগুলি সন্নিবেশ করা উচিত নয়, বিস্তৃত পরিস্থিতিতে। এসকিউএল আপনার জন্য সেই জিনিসগুলি সিদ্ধান্ত নিতে দিন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.