문의 "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 ... VALUES
Daniel Vassallo의 답변과 같은 구문에는 한 가지 성가신 제한이 있습니다.
VALUES 목록에 직접 행을 삽입하여 구성할 수 있는 최대 행 수는 1000개입니다.
이 제한을 생략하는 가장 쉬운 방법은 다음과 같은 파생 테이블을 사용하는 것입니다.
INSERT INTO dbo.Mytable(ID, Name)
SELECT ID, Name
FROM (
VALUES (1, 'a'),
(2, 'b'),
--...
-- more than 1000 rows
)sub (ID, Name);
이것은 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이 대신 결정하도록 하세요.
다중 삽입에서는 하위 쿼리 평가에서 반환된 행에서 파생된 계산된 행을 하나 이상의 테이블에 삽입합니다.
무조건 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를 한 번 실행합니다.
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
'programing' 카테고리의 다른 글
OPTION(재컴파일)은 항상 고속입니다.그 이유는 무엇입니까? (0) | 2023.04.08 |
---|---|
SQL 서버의 서로 다른 두 서버에서 데이터 선택 (0) | 2023.04.08 |
SQL 기본 제약 조건을 이름을 모르면서 삭제하는 방법 (0) | 2023.04.08 |
SQL Server SELECT IN @variable? (0) | 2023.04.08 |
react.default.createContext는 react-redux를 사용할 때 함수가 아닙니다. (0) | 2023.04.03 |