470

저는 수년 전에 이것을 해왔다는 것을 알고 있습니다. 그러나 구문을 기억할 수는 없으며 "벌크 수입"에 대한 도움말 문서와 기사를 끌어 올 수 있기 때문에 어디서나 찾을 수는 없습니다.

여기 내가하고 싶은,하지만 구문이 정확하지 않습니다 ... 제발,이 일을 전에 누군가가 도와주세요 :)

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'.


  • 위의 코드는 ', ' after values 문 - sam
  • INSERT INTO @blah (ID, Name), VALUES (123, Timmy), VALUES (124, Jonny), VALUES (125, &Sally ' ) - sam
  • 주의 사항 :이 방법으로 만 최대 1000 개의 행을 삽입 할 수 있습니다. INSERT INTO #Test (LWPurchaseOrderID) VALUES (935791), (935933) - Anoop Verma
  • 2005 년은 더 이상 지원되지 않습니다. 2008 년, 2012 년 및 2016 년거의당신이 쓴 것을 사용하십시오.INSERT INTO @blah (ID, Name) VALUES (123, 'Timmy'), (124, 'Jonny'), (125, 'Sally') "VALUES" 한 번만 나타나며 세트 사이에는 쉼표가 필요합니다. - J. Chris Compton

13 답변


297

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

SQL Server 2008의 경우 하나의 VALUES 절에서이를 수행 할 수 있습니다.정확하게귀하의 질문에 성명에 따라 (당신은 각 값 진술을 구분하는 쉼표를 추가해야합니다) ...


  • 여러 개의 INSERT 문을 사용하는 것보다 더 효율적입니까? - Code Commander
  • @ 코드 커맨더 : 아니, 컴파일하는 것이 더 길다는 점에서. 예, 한 개의 삽입 만 있습니다. 그러나 그것은 질문에 답합니다 :INSERT table (columnlist) - gbn
  • @VoidKing 나는 이것이 나중에 1 년 후에 온다는 것을 알고있다. 그리고 당신은 이것을 아직 알지 못했을 것이다. 그러나 그것은 정말로 간단하다. 사용하여select열과 행이있는 집합을 만들면 디자인에 따라이 행을 만들 수 있습니다.insert동일한 양의 컬럼을 가진 다른 테이블로 옮겨진다. 리터럴과 값을 혼합하여 사용할 수도 있습니다. 예를 들어insertselect 'A', ID from ATable& # 39; 첫 번째 열에서 매번 두 번째 열에있는 ATable의 해당 행의 ID 열 값. - MarioDS
  • 이것은 또한 DB2와 함께 작동하는데, 이는 구식 기술에 머물러있는 사람들에게 중요한 편의를 제공합니다. 쉼표로 구분 된 값은 SQL Server 2008 이상에서 작업하는 사람들에게 내 마음이 더 낫습니다. OP는 모든 "값"을 제거 할 수있다. 첫 번째를 제외하고 a로 대체하십시오. - JPK
  • @PRMan 당신은 버전 SQL Server 2008 후에 그것을하지 않을 것이다. 언급 한 바와 같이 ... - gbn

457

구문은 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 2005에는 필요하지 않습니다.msdn.microsoft.com/en-us/library/ms174335.aspx참고 : SQL Server 2008에는 Transact-SQL 행 생성자 (테이블 값 생성자라고도 함)가 도입되어 단일 INSERT 문에 여러 행을 지정합니다. - abatishchev
  • @abatishchev : 예, 질문에 답한 (게시 된 후 4 분이 지났음) 질문에 'SQL-server-2005'태그가 지정되지 않았습니다. 실제로 OP는 나중에이를 지정하기 위해 게시물을 편집했으며 & EDIT & # 39; 상표. 원래의 질문에는 간단히 & # 39; 태스킹 (& amp; - Daniel Vassallo
  • Server 2008에서는이 방법으로 1000 개가 넘는 행을 삽입 할 수 없습니다. - Michael
  • 하나의 값 집합에 결함이 있으면 어떻게됩니까? 모든 삽입이 롤백되거나 결함있는 행만 롤백됩니까? - netblognet
  • @netblognet 오류 행만 삽입되지 않았는지 테스트했습니다. (다른 모든 행은 올바르게 삽입되었습니다) - Mauricio Gracia Gutierrez

216

데이터가 이미 데이터베이스에있는 경우 다음을 수행 할 수 있습니다.

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)


16

사용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 이상에서 작동합니다.


  • 이 & # 39; 하위 & # 39;에 대한 기사 링크를 사용할 수 있습니까? 통사론. - CodeCamper
  • @CodeCamperdocs.microsoft.com/en-us/sql/t-sql/queries/…섹션:C. Specifying multiple values as a derived table in a FROM clause - Lukasz Szozda
  • 이 대답의 장점은 반복하지 않고 동일한 값을 지정할 수있는 방법을 제공한다는 것입니다. 예 : 세 번째 열이 동일하면 천 번 반복해야합니다. - Vadim Berman
  • @VadimBerman 예, 테이블에 정의 된 기본값이없는 경우에 좋은 시나리오입니다. - Lukasz Szozda

13

당신은 이것을 할 수 있습니다 (추악하지만 작동합니다) :

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


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 & amp; 이전에 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 구문 분석 중에 구문이 잘못되었습니다.


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
)

따라서 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();
        }


1

이것은 당신이 요구하는 것을 성취 할 것입니다 :

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

연결된 질문


관련된 질문

최근 질문