Programming

명령문의 "INSERT INTO dbo.Blah"부분을 반복하지 않고 여러 행을 삽입하려면 어떻게합니까?

procodes 2020. 2. 11. 22:43
반응형

명령문의 "INSERT INTO dbo.Blah"부분을 반복하지 않고 여러 행을 삽입하려면 어떻게합니까?


몇 년 전에이 작업을 수행 한 것을 알고 있지만 구문을 기억할 수 없으며 "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'.


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

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


구문은 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에 관한 것임을 분명히 알 수 없었습니다. 나는 여전히 관련이 있다고 생각하기 때문에이 답변을 여기에 남겨두고 있습니다.


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

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)

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 이상부터 작동합니다


이 작업을 수행 할 수 있습니다 (추악하지만 작동합니다).

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

공용체를 사용할 수 있습니다.

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)

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

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

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

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)

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)

나는 다음을 사용했다 :

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

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

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


에 해당하는 INSERT (Transact-SQL)를 참조하십시오 그렇지 생략 (2005 SQL 서버) 할 수 INSERT INTO dbo.Blah있으며 매 시간을 지정하거나 다른 구문 / 접근 방법을 사용해야합니다,


이것은 매우 빠르고 효율적으로 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();
        }

참고 : https://stackoverflow.com/questions/2624713/how-do-i-insert-multiple-rows-without-repeating-the-insert-into-dbo-blah-part



반응형