INSERT(Transact-SQL)
테이블이나 뷰에 한 개 이상의 새 행을 추가합니다. 예를 보려면 INSERT 예(Transact-SQL)를 참조하십시오.
[ WITH <common_table_expression> [ ,...n ] ]
INSERT
[ TOP (expression) [ PERCENT ] ]
[ INTO ]
{ <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
{
[ (column_list) ]
[ <OUTPUT Clause> ]
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ]
| derived_table
| execute_statement
| <dml_table_source>
| DEFAULT VALUES
}
}
[; ]
<object> ::=
{
[ server_name . database_name . schema_name .
| database_name .[ schema_name ] .
| schema_name .
]
table_or_view_name
}
<dml_table_source> ::=
SELECT <select_list>
FROM ( <dml_statement_with_output_clause> )
[AS] table_alias [ ( column_alias [ ,...n ] ) ]
[ WHERE <search_condition> ]
[ OPTION ( <query_hint> [ ,...n ] ) ]
INSERT INTO…SELECT를 사용하여 최소 로깅으로 데이터 대량 로드
INSERT INTO <target_table> SELECT <columns> FROM <source_table>을 사용하여 최소 로깅으로 효율적으로 준비 테이블과 같은 한 테이블의 많은 수의 행을 다른 테이블로 전송할 수 있습니다. 최소 로깅은 문의 효율성을 향상시키며 트랜잭션 작업 중에 사용 가능한 트랜잭션 로그 공간을 꽉 채울 작업의 가능성을 줄여줍니다.
이 문의 최소 로깅을 위해서는 다음과 같은 요구 사항이 충족되어야 합니다.
-
데이터베이스의 복구 모델이 단순 또는 대량 로그로 설정되어야 합니다.
-
대상 테이블은 비어 있거나 비어 있지 않은 힙이어야 합니다.
-
대상 테이블이 복제에 사용되지 않아야 합니다.
-
TABLOCK 힌트가 대상 테이블에 지정되어 있어야 합니다.
MERGE 문의 삽입 작업 결과에 따라 행을 힙에 삽입하는 경우에도 최소 로깅이 가능합니다.
덜 제한적인 대량 업데이트 잠금을 갖는 BULK INSERT 문과 달리 TABLOCK 힌트를 사용하는 INSERT INTO…SELECT는 테이블에 대해 배타적(X) 잠금을 갖습니다. 즉, 병렬 삽입 작업을 사용하여 행을 삽입할 수 없습니다. 잠금에 대한 자세한 내용은 잠금 모드를 참조하십시오.
OPENROWSET 및 BULK를 사용하여 데이터 대량 로드
OPENROWSET 함수는 다음 테이블 힌트를 사용하여 INSERT 문에 대량 로드 최적화를 제공합니다.
-
TABLOCK 힌트를 통해 삽입 작업에 대한 로그 레코드의 수를 최소화할 수 있습니다. 데이터베이스 복구 모델은 단순 또는 대량 로그로 설정되어야 하며 대상 테이블은 복제에 사용될 수 없습니다. 자세한 내용은 대량 가져오기의 최소 로깅을 위한 선행 조건을 참조하십시오.
-
IGNORE_CONSTRAINTS 힌트는 FOREIGN KEY 및 CHECK 제약 조건 검사를 임시로 해제할 수 있습니다.
-
IGNORE_TRIGGERS 힌트는 Trigger 실행을 임시로 해제할 수 있습니다.
-
KEEPDEFAULTS 힌트는 데이터 레코드에 열의 값이 없는 경우 NULL 대신 테이블 열의 기본값(있는 경우)을 삽입하도록 허용합니다.
-
KEEPIDENTITY 힌트는 가져온 데이터 파일의 ID 값이 대상 테이블의 ID 열에 사용되도록 허용합니다.
이러한 최적화는 BULK INSERT 명령에서 사용할 수 있는 최적화와 비슷합니다. 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하십시오.
행을 삽입할 때는 다음과 같은 데이터 형식 동작을 고려합니다.
-
char , varchar 또는 varbinary 데이터 형식의 열에 값이 로드되는 경우 후행 공백(char 및 varchar의 경우 공백, varbinary의 경우 0)의 채우기 또는 잘라내기는 테이블이 생성될 때 열에 대해 정의된 SET ANSI_PADDING 설정에 의해 결정됩니다. 자세한 내용은 SET ANSI_PADDING(Transact-SQL)을 참조하십시오.
다음 표에서는 SET ANSI_PADDING이 OFF일 때의 기본 작업을 보여 줍니다.
데이터 형식
기본 작업
char
정의된 열 너비만큼 공백으로 값을 채웁니다.
varchar
공백이 아닌 마지막 문자 또는 단일 공백 문자(공백으로만 이루어진 문자열의 경우)에 대한 후행 공백을 제거합니다.
varbinary
후행 0을 제거합니다.
-
빈 문자열(' ')이 varchar 또는 text 데이터 형식의 열에 로드되는 경우 기본 작업은 길이가 0인 문자열을 로드하는 것입니다.
-
text 또는 image 열에 Null 값을 삽입하면 유효한 텍스트 포인터가 생성되지 않고 8KB 텍스트 페이지도 사전 할당되지 않습니다. text 및 image 데이터 삽입에 대한 자세한 내용은 text, ntext 및 image 함수 사용을 참조하십시오.
-
uniqueidentifier 데이터 형식으로 만든 열은 특수한 형식의 16바이트 이진 값을 저장합니다. ID 열의 경우와 달리 uniqueidentifier 데이터 형식의 열에 대해서는 데이터베이스 엔진이 자동으로 값을 생성하지 않습니다. 삽입 작업 중에는 uniqueidentifier 열에 uniqueidentifier 데이터 형식의 변수 및 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(하이픈을 포함하여 36자, x는 0-9 또는 a-f 범위의 16진수 값) 형식의 문자열 상수를 사용할 수 있습니다. 예를 들어 6F9619FF-8B86-D011-B42D-00C04FC964FF는 uniqueidentifier 변수 또는 열에 대해 유효한 값입니다. GUID(Globally Unique Identifier)를 가져오려면 NEWID() 함수를 사용하십시오.
사용자 정의 형식 열에 값 삽입
다음과 같은 방법으로 사용자 정의 형식 열에 값을 삽입할 수 있습니다.
-
사용자 정의 형식의 값을 제공합니다.
-
사용자 정의 형식에서 SQL Server 시스템 데이터 형식의 암시적 또는 명시적 변환이 지원되는 경우 해당 형식의 값을 제공합니다. 다음 예에서는 문자열의 명시적 변환을 통해 Point 사용자 정의 형식 열에 값을 삽입하는 방법을 보여 줍니다.
INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') );
모든 사용자 정의 형식은 이진 형식에서의 암시적 변환이 가능하기 때문에 명시적 변환을 수행하지 않고도 이진 값을 제공할 수 있습니다. 변환 및 사용자 정의 형식에 대한 자세한 내용은 사용자 정의 형식 작업 수행을 참조하십시오.
-
사용자 정의 형식의 값을 반환하는 사용자 정의 함수를 호출합니다. 다음 예에서는 CreateNewPoint() 사용자 정의 함수를 사용하여 Point 사용자 정의 형식의 새 값을 만들고 이 값을 Cities 테이블에 삽입합니다.
INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
TRY…CATCH 구문에 문을 지정하여 INSERT 문에 대한 오류 처리를 구현할 수 있습니다. 자세한 내용은 Transact-SQL에서 TRY...CATCH 사용을 참조하십시오.
INSERT 문이 제약 조건 또는 규칙을 위반하거나 열의 데이터 형식과 호환되지 않는 값을 가진 경우에는 문이 실패하고 오류 메시지가 반환됩니다.
INSERT가 SELECT 또는 EXECUTE를 사용하여 여러 행을 로드하는 경우 로드되는 값 중에서 규칙 또는 제약 조건 위반이 발생하면 문이 중지되며 어떠한 행도 로드되지 않습니다.
식 평가 중 INSERT 문에서 산술 오류(오버플로, 0으로 나누기, 도메인 오류 등)가 발생하면 데이터베이스 엔진은 SET ARITHABORT가 ON으로 설정된 것으로 가정하고 이러한 오류를 처리합니다. 일괄 처리가 중지되고 오류 메시지가 반환됩니다. SET ARITHABORT 및 SET ANSI_WARNINGS가 OFF일 때 INSERT, DELETE 또는 UPDATE 문에서 식 평가 중 산술 오류(오버플로, 0으로 나누기 또는 도메인 오류)가 발생하면 SQL Server는 NULL 값을 삽입하거나 업데이트합니다. 대상 열이 Null 허용이 아니면 삽입이나 업데이트 동작이 실패하고 사용자에게 오류 메시지가 보내집니다. 자세한 내용은 ARITHABORT 및 ARITHIGNORE가 ON으로 설정된 경우의 동작을 참조하십시오.
테이블이나 뷰에 대한 INSERT 동작에 INSTEAD OF 트리거가 정의되면 INSERT 문 대신 트리거가 실행됩니다. INSTEAD OF 트리거에 대한 자세한 내용은 CREATE TRIGGER(Transact-SQL)를 참조하십시오.
원격 테이블로 값을 삽입할 때 일부 열의 값이 지정되지 않은 경우 사용자가 지정된 값을 삽입할 열을 식별해야 합니다.
SET ROWCOUNT 옵션 설정은 로컬 및 원격 분할 뷰에 대한 INSERT 문에서는 무시됩니다. 또한 이 옵션은 원격 테이블에 대해 실행된 INSERT 문에서는 지원되지 않습니다.
중요
|
|---|
|
SQL Server의 다음 버전에서는 DELETE, INSERT 및 UPDATE 문이 SET ROWCOUNT 사용에 영향을 받지 않게 됩니다. 새 개발 작업에서는 DELETE, INSERT 및 UPDATE 문에 SET ROWCOUNT 옵션을 사용하지 않도록 하고 현재 이 옵션을 사용하는 응용 프로그램은 수정하십시오. 대신 TOP 절을 사용하는 것이 좋습니다. |
연결된 서버를 연결하는 동안 보내는 서버에서는 연결된 서버를 대신해서 로그인 이름과 암호를 제공하여 받는 서버에 연결합니다. 이 연결을 사용하려면 sp_addlinkedsrvlogin을 사용하여 연결된 서버 간의 로그인 매핑을 만들어야 합니다. 자세한 내용은 연결된 서버의 보안을 참조하십시오.
OPENROWSET(BULK…)을 사용할 때는 SQL Server에서 가장을 처리하는 방법을 이해하는 것이 중요합니다. 자세한 내용은 BULK INSERT 또는 OPENROWSET(BULK...)를 사용하여 데이터 대량 가져오기의 “보안 고려 사항”을 참조하십시오.
예를 보려면 INSERT 예(Transact-SQL)를 참조하십시오.
