명령문의 "INSERT INTO…"부분을 반복하지 않고 여러 행을 삽입 하시겠습니까?


536

몇 년 전에이 작업을 수행 한 것을 알고 있지만 구문을 기억할 수 없으며 "bulk imports"에 대한 많은 도움말 문서와 기사를 가져 와서 어디에서나 구문을 찾을 수 없습니다.

여기에 내가하고 싶은 일이 있지만 구문이 정확하지 않습니다 ... 제발, 전에 이것을 한 사람이 나를 도와주세요 :)

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
@blah (ID, 이름), VALUES (123, 'Timmy'), VALUES (124, 'Jonny'), VALUES (125, 'Sally')에 삽입
sam

1
이 방법으로 만 최대 1000 개의 행을 삽입 할 수 있습니다. INSERT INTO #Test (LWPurchaseOrderID) 가치 (935791) (935933)
Anoop 베르

16
2005는 더 이상 지원되지 않습니다. 2008, 2012 및 2016의 경우 "VALUES" 를 입력 한 것을 거의INSERT INTO @blah (ID, Name) VALUES (123, 'Timmy'), (124, 'Jonny'), (125, 'Sally') 한 번만 사용할 수 있으며 세트 사이에 쉼표가 필요합니다.
J. Chris Compton

답변:


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

SQL 서버 2008, 하나의 VALUES 절에서 그것을 할 수 정확히 질문의 문에 따라 (당신은 각각의 값 문을 구분하는 쉼표를 추가해야합니다) ...


10
여러 INSERT 문을 사용하는 것보다 더 효율적인가요?
코드 사령관

7
@Code Commander : 아니요, 컴파일 시간이 길다는 점에서 아닙니다. 예, 하나의 인서트 만 있다는 점에서. 의 반복 없음 :하지만이 질문에 대답INSERT table (columnlist)
GBN

3
@VoidKing 나는 반 년 후에 이것이 온다는 것을 알고 있으며, 오래 전에 이것을 알아 냈을 수도 있지만 실제로는 매우 간단합니다. 을 사용하여 select열과 행이있는 세트를 작성하고 설계 상 이러한 행을 insert동일한 양의 열이있는 다른 테이블에 넣을 수 있습니다 . 리터럴과 값을 혼합하여 사용할 수도 있습니다. 예를 들어 insertwith를 사용 하면 select 'A', ID from ATable매번 첫 번째 열에 'A'를 삽입하고 두 번째 열에있는 ATable의 해당 행의 ID 열 값을 삽입합니다.
MarioDS

1
이것은 또한 오래된 기술에 갇힌 사람들에게 중요한 부가 정보 인 DB2 와도 작동합니다. 쉼표로 구분 된 값은 SQL Server 2008 이상에서 일하는 사람들에게 더 좋습니다. OP는 첫 번째를 제외한 모든 "값"을 제거하고으로 대체 할 수 있습니다.
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 Server 2012에서 작동
user2601995

27
Server 2008에서는이 방법으로 1000 개 이상의 행을 삽입 할 수 없습니다.
Michael-Clay Shirky는 어디에?

1
하나의 값 세트에 결함이 있으면 어떻게됩니까? 모든 인서트가 롤백됩니까? 아니면 잘못된 행만 있습니까?
netblognet

2
@netblognet 난 그냥 단지 결함 행 (올바르게 삽입되어있는 모든 사람들의 모든)에 삽입되지 않도록 시험
마우 그라시아 구티에레즈

1
그것은 해제 할 수 @Michael stackoverflow.com/a/42703601/5070879
루카스 Szozda

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

Daniel Vassallo의 답변 INSERT INTO ... VALUES과 같은 구문을 사용하면 성가신 한계가 있습니다.

에서 MSDN

값 목록에 직접 행을 삽입하여 구성 할 수있는 최대 행 수는 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 이상부터 작동합니다


이 '서브'구문에 대한 기사에 대한 링크를 가질 수 있습니까?
CodeCamper

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
이 답변의 장점은 동일한 값을 반복하지 않고 지정할 수있는 방법을 제공한다는 것입니다 (이것이 내가 찾고 있던 것입니다). 예를 들어 동일한 세 번째 열을 사용하면 천 번 반복 할 필요가 없습니다.
Vadim Berman

1
@VadimBerman 예, 테이블에 기본값이 정의되어 있지 않은 경우 좋은 시나리오입니다.
Lukasz Szozda

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 Server에서 XML을 사용하여 여러 행을 삽입하는 것이 더 쉬울 것입니다. 그렇지 않으면 매우 지루합니다.

코드 설명이 포함 된 전체 기사보기 : http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

다음 코드를 SQL Server에 복사하여 샘플을보십시오.

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

ID 및 이름에 고유 한 GUID를 사용하여 10 개의 행을 추가합니다.

참고 : 마지막 줄 (GO 10)을 ';'으로 끝내지 마십시오. 오류가 발생하기 때문에 치명적인 스크립팅 오류가 발생했습니다. GO를 구문 분석하는 중에 구문이 올바르지 않습니다.



2

이것은 매우 빠르고 효율적으로 SQL에서 작동합니다. Table이 있다고 가정하십시오 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
)

따라서 insert 문을 반복하지 않고 다음 쿼리를 사용하여이 테이블에 여러 레코드를 삽입 할 수 없습니다.

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)

또한 C #을 사용하여 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

무조건 다중 테이블 삽입을 수행하려면 ALL 다음에 여러 insert_into_clauses를 지정하십시오. Oracle Database는 하위 쿼리에서 반환 된 각 행에 대해 각 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

또한 ID는 아마도 identity (1,1)이어야하며 대부분의 상황에서 삽입해서는 안됩니다. SQL 당신을 위해 그 물건 결정하게 하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.