programing

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

topblog 2023. 4. 8. 07:51
반응형

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

이 작업은 몇 년 전에 한 적이 있습니다만, 구문이 기억나지 않습니다.또한 도움말 문서나 「대량 Import」에 관한 기사를 많이 읽었기 때문에 어디에서도 찾을 수 없습니다.

제가 하고 싶은 일은 이렇습니다만, 구문이 정확하지 않습니다.전에 이 일을 해 본 적이 있는 분, 도와주세요:)

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

구문은 SQL Server 2008에서 거의 기능합니다(SQL Server1 2005에서는 기능하지 않습니다).

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 dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'

SQL Server 2008의 경우 질문의 스테이트먼트에 따라 정확하게 하나의 VALUES 절로 실행할 수 있습니다(각 Values 스테이트먼트를 구분하기 위해 쉼표를 추가하면 됩니다).

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

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)

「」를 사용합니다.INSERT INTO ... VALUESDaniel Vassallo의 답변과 같은 구문에는 한 가지 성가신 제한이 있습니다.

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+부터 동작합니다.

이렇게 하면 원하는 것을 실현할 수 있습니다.

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

다음과 같이 할 수 있습니다(추악하지만 동작합니다).

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)

SQL Server 2008에서는 정상입니다.SS2005 이전 버전에서는 VALUES 스테이트먼트를 반복해야 합니다.

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

편집: 제 잘못입니다.SS2005의 각 행에 대해 'INSERT IN'을 반복해야 합니다.

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 서버에 복사하십시오.

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) (SQL Server 2005)에 대응하여 생략할 수 없습니다.INSERT INTO dbo.Blah/어느 정도 즉 다른 구문/어느 정도의 구문/어느 정도의 구문/어느 정도의 구문/어느 정도의 구문/어느 정도의 구문/어느 정도의 구문/어느 정도의 구문/어느 정도의 이다.

포스트그레SQL은 다음과 같이 실행할 수 있습니다.

2열 테이블의 일반적인 예.

INSERT INTO <table_name_here>
    (<column_1>, <column_2>)
VALUES
    (<column_1_value>, <column_2_value>),
    (<column_1_value>, <column_2_value>),
    (<column_1_value>, <column_2_value>),
    ...
    (<column_1_value>, <column_2_value>);

실제의 예는 이쪽을 참조해 주세요.

A - 테이블 작성

CREATE TABLE Worker
(
    id serial primary key,
    code varchar(256) null,
    message text null
);

B - 벌크 값 삽입

INSERT INTO Worker
    (code, message)
VALUES
    ('a1', 'this is the first message'),
    ('a2', 'this is the second message'),
    ('a3', 'this is the third message'),
    ('a4', 'this is the fourth message'),
    ('a5', 'this is the fifth message'),
    ('a6', 'this is the sixth message');

입니다..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#을 사용한 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();
        }

여기 있는 다른 사람들은 몇 가지 다중 레코드 구문을 제안합니다.설명하자면, 우선 임시 테이블에 삽입하고 거기서 메인 테이블을 삽입하는 것이 좋습니다.

그 이유는 쿼리에서 데이터를 로드하는 데 시간이 오래 걸리고 테이블 또는 페이지가 필요 이상으로 잠길 수 있기 때문에 해당 테이블에 대해 실행되는 다른 쿼리가 느려지기 때문입니다.

-- 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는 아이덴티티(1,1)여야 하며 삽입해서는 안 됩니다.SQL이 대신 결정하도록 하세요.

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 Server 여러 행 삽입

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

여러 레코드를 동시에 삽입하기 위한 테이블을 작성했습니다.

CREATE TABLE TEST 
(
    id numeric(10,0),
    name varchar(40)
)

그 후 여러 레코드를 삽입하는 저장 프로시저를 만들었습니다.

CREATE PROCEDURE AddMultiple
(
    @category varchar(2500)
)
as
BEGIN

declare @categoryXML xml;
set @categoryXML = cast(@category as xml);

    INSERT INTO TEST(id, name)
    SELECT
        x.v.value('@user','VARCHAR(50)'),
        x.v.value('.','VARCHAR(50)')
    FROM @categoryXML.nodes('/categories/category') x(v)
END
GO

순서를 실행했다.

EXEC AddMultiple @category = '<categories> 
                                  <category user="13284">1</category> 
                                  <category user="132">2</category>
                              </categories>';

그런 다음 표를 조회하여 확인합니다.

select * from TEST;

여기에 이미지 설명 입력

원본 데이터에는 json을 사용하는 것이 좋으며 temp table은 필요하지 않습니다.

DECLARE @json varchar(max) = '[
  {
    "ID": 123,
    "Name": "Timmy"
  },
  {
    "ID": 124,
    "Name": "Jonny"
  },
  {
    "ID": 125,
    "Name": "Sally"
  }
]';


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

INSERT INTO @blah (ID, Name)
SELECT * FROM OPENJSON(@json)
WITH (ID int, Name varchar(100))

SELECT * FROM @blah

언급URL : https://stackoverflow.com/questions/2624713/insert-multiple-rows-without-repeating-the-insert-into-part-of-the-stateme

반응형