INSERT(Transact-SQL)
SQL Server 2008 R2에서 테이블 또는 뷰에 새 행을 하나 이상 추가합니다. 예를 보려면 INSERT 예(Transact-SQL)를 참조하십시오.
구문
-- Standard INSERT syntax
[ 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
}
}
}
[; ]
-- Syntax for external tool only
INSERT
{
[BULK]
[ database_name . [ schema_name ] . | schema_name . ]
[ table_name | view_name ]
( <column_definition> )
[ WITH (
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] KEEP_NULLS ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] TABLOCK ]
) ]
}
[; ]
<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 ] ) ]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max ]
인수
WITH <common_table_expression>
INSERT 문의 범위 내에 정의되는 임시로 명명된 결과 집합(공통 테이블 식이라고도 함)을 지정합니다. 결과 집합은 SELECT 문에서 파생됩니다.CTE(공통 테이블 식)는 SELECT, DELETE, UPDATE, MERGE 및 CREATE VIEW 문에도 사용할 수 있습니다. 자세한 내용은 WITH common_table_expression(Transact-SQL)을 참조하십시오.
TOP (expression) [ PERCENT ]
삽입할 임의 행의 수 또는 비율을 지정합니다. expression은 행의 수 또는 비율일 수 있습니다. INSERT, UPDATE 또는 DELETE에 사용되고 TOP 식에서 참조되는 행은 어떠한 순서로도 정렬되지 않습니다.INSERT, UPDATE 및 DELETE 문에는 TOP에서 expression을 구분하는 괄호가 필요합니다. 자세한 내용은 TOP(Transact-SQL)을 참조하십시오.
INTO
INSERT와 대상 테이블 사이에 사용할 수 있는 선택적 키워드입니다.server_name
테이블 또는 뷰가 있는 연결된 서버의 이름입니다. server_name 은 연결된 서버 이름으로 지정하거나 OPENDATASOURCE 함수를 사용하여 지정할 수 있습니다.server_name을 연결된 서버로 지정할 경우에는 database_name 및 schema_name이 필요합니다. OPENDATASOURCE를 사용하여 server_name을 지정할 경우에는 database_name 및 schema_name이 일부 데이터 원본에 적용되지 않을 수 있으며 원격 개체에 액세스하는 OLE DB 공급자의 기능에 따라 달라집니다. 자세한 내용은 분산 쿼리를 참조하십시오.
database_name
데이터베이스의 이름입니다.schema_name
테이블 또는 뷰가 속해 있는 스키마의 이름입니다.table_or view_name
데이터를 받는 테이블 또는 뷰의 이름입니다.해당 범위 내에서 table 변수를 INSERT 문의 테이블 원본으로 사용할 수 있습니다.
table_or_view_name에서 참조되는 뷰는 업데이트할 수 있어야 하고 해당 뷰의 FROM 절에서 기본 테이블을 하나만 참조해야 합니다. 예를 들어 여러 테이블 뷰에 INSERT를 실행하려면 하나의 기본 테이블에서만 열을 참조하는 column_list를 사용해야 합니다. 업데이트할 수 있는 뷰에 대한 자세한 내용은 CREATE VIEW(Transact-SQL)를 참조하십시오.
rowset_function_limited
OPENQUERY 또는 OPENROWSET 함수입니다. 이러한 함수의 사용은 원격 개체에 액세스하는 OLE DB 공급자의 기능에 영향을 받습니다. 자세한 내용은 분산 쿼리를 참조하십시오.WITH ( <table_hint_limited> [... n ] )
대상 테이블에 허용되는 하나 이상의 테이블 힌트를 지정합니다. 여기에는 WITH 키워드와 괄호가 필요합니다.READPAST, NOLOCK 및 READUNCOMMITTED는 허용되지 않습니다. 테이블 힌트에 대한 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하십시오.
중요 INSERT 문의 대상 테이블에 HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD 또는 UPDLOCK 힌트를 지정하는 기능은 이후 버전의 SQL Server에서 제거될 예정입니다. 이러한 힌트는 INSERT 문의 성능에 영향을 주지 않습니다. 향후 개발 작업에서는 이러한 힌트를 사용하지 않도록 하고 현재 이 힌트를 사용하는 응용 프로그램은 수정하십시오.
INSERT 문의 대상 테이블에 TABLOCK 힌트를 지정하는 것은 TABLOCKX 힌트를 지정하는 것과 결과가 같습니다. 두 경우 모두 테이블을 독점하여 잠급니다.
(column_list)
데이터를 삽입할 하나 이상의 열 목록입니다. column_list는 괄호로 묶고 쉼표로 구분해야 합니다.열이 column_list에 없는 경우 데이터베이스 엔진에서는 열 정의에 따라 값을 제공할 수 있어야 합니다. 그렇지 않으면 행을 로드할 수 없습니다. 열이 다음과 같은 경우에는 데이터베이스 엔진에서 자동으로 열의 값을 제공합니다.
IDENTITY 속성이 있는 경우. 다음 증분 ID 값이 사용됩니다.
기본값이 있는 경우. 열의 기본값이 사용됩니다.
timestamp 데이터 형식이 있는 경우. 현재 타임스탬프 값이 사용됩니다.
Null을 허용하는 경우. Null 값이 사용됩니다.
계산 열인 경우. 계산된 값이 사용됩니다.
명시적 값을 ID 열에 삽입하는 경우 column_list와 값 목록을 사용해야 하며 테이블에 대해 SET IDENTITY_INSERT 옵션을 ON으로 설정해야 합니다.
OUTPUT Clause
삽입 작업의 일부로 삽입된 행을 반환합니다. 결과는 처리 중인 응용 프로그램에 반환되거나 다음 처리를 위해 테이블 또는 테이블 변수에 삽입될 수 있습니다.로컬 분할 뷰, 분산형 분할 뷰 또는 원격 테이블을 참조하는 DML 문이나 execute_statement를 포함한 INSERT 문에서는 OUTPUT 절이 지원되지 않습니다. <dml_table_source> 절을 포함하는 INSERT 문에서는 OUTPUT INTO 절이 지원되지 않습니다.
VALUES
삽입할 데이터 값의 목록을 표시합니다. column_list(지정된 경우) 또는 테이블의 각 열에 대해 하나의 데이터 값이 있어야 합니다. 값 목록은 괄호로 묶어야 합니다.값 목록의 값이 테이블의 열 순서와 다르거나 테이블의 각 열에 상응하는 값이 목록에 없으면 column_list를 사용하여 들어오는 값을 각각 저장하는 열을 명시적으로 지정해야 합니다.
Transact-SQL 행 생성자(테이블 값 생성자라고도 함)를 사용하여 하나의 INSERT 문에 여러 행을 지정할 수 있습니다. 행 생성자는 여러 개의 값 목록을 괄호로 묶고 쉼표로 구분한 하나의 VALUES 절로 구성됩니다. 자세한 내용은 테이블 값 생성자(Transact-SQL)를 참조하십시오.
DEFAULT
데이터베이스 엔진에서 열에 대해 정의된 기본값을 로드하도록 설정합니다. 열에 대한 기본값이 없고 열에 Null 값을 사용할 수 있는 경우 NULL이 삽입됩니다. timestamp 데이터 형식으로 정의된 열의 경우에는 다음 타임스탬프 값이 삽입됩니다. ID 열에는 DEFAULT를 사용할 수 없습니다.expression
상수, 변수 또는 식입니다. 식은 EXECUTE 문을 포함할 수 없습니다.nchar, nvarchar 및 ntext 유니코드 문자 데이터 형식을 참조할 때는 'expression' 앞에 대문자 'N'이 접두사로 와야 합니다. 'N'을 지정하지 않으면 SQL Server에서는 데이터베이스 또는 열의 기본 데이터 정렬에 해당하는 코드 페이지로 문자열을 변환합니다. 이 코드 페이지에 없는 문자는 모두 손실됩니다. 자세한 내용은 유니코드를 사용한 서버측 프로그래밍을 참조하십시오.
derived_table
테이블에 로드할 데이터 행을 반환하는 유효한 SELECT 문입니다. SELECT 문은 CTE(공통 테이블 식)를 포함할 수 없습니다.execute_statement
SELECT 또는 READTEXT 문을 사용하여 데이터를 반환하는 유효한 EXECUTE 문입니다.execute_statement 를 INSERT에 사용하는 경우 각 결과 집합은 테이블 또는 column_list의 열과 호환되어야 합니다.
execute_statement를 사용하여 같은 서버 또는 원격 서버에서 저장 프로시저를 실행할 수 있습니다. 원격 서버에서 프로시저를 실행하면 결과 집합이 로컬 서버에 반환되어 로컬 서버의 테이블에 로드됩니다. 연결에 MARS(Multiple Active Result Sets)가 설정된 경우에는 분산 트랜잭션에서 루프백 연결된 서버에 대해 execute_statement를 실행할 수 없습니다.
execute_statement에서 READTEXT 문을 사용하여 데이터를 반환하는 경우 각 READTEXT 문은 최대 1MB(1024KB)의 데이터를 반환할 수 있습니다. 또한 execute_statement를 확장 프로시저에 사용할 수도 있습니다. execute_statement는 확장 프로시저의 주 스레드에서 반환하는 데이터는 삽입하지만 주 스레드를 제외한 스레드에서 나온 출력은 삽입하지 않습니다.
테이블 반환 매개 변수를 INSERT EXEC 문의 대상으로 지정할 수는 없지만 INSERT EXEC 문자열 또는 저장 프로시저의 원본으로 지정할 수 있습니다. 자세한 내용은 테이블 반환 매개 변수(데이터베이스 엔진)를 참조하십시오.
<dml_table_source>
INSERT, UPDATE, DELETE 또는 MERGE 문의 OUTPUT 절에서 반환하고 선택적으로 WHERE 절로 필터링되는 행이 대상 테이블에 삽입되도록 지정합니다. <dml_table_source>를 지정한 경우 외부 INSERT 문의 대상은 다음 제한 사항에 맞아야 합니다.뷰가 아니라 기본 테이블이어야 합니다.
원격 테이블일 수 없습니다.
정의된 트리거를 포함할 수 없습니다.
기본 키-외래 키 관계에 참여할 수 없습니다.
트랜잭션 복제에 대한 병합 복제 또는 업데이트할 수 있는 구독에 참여할 수 없습니다.
데이터베이스의 호환성 수준이 100 이상으로 설정되어야 합니다. 자세한 내용은 OUTPUT 절(Transact-SQL)을 참조하십시오.
<select_list>
OUTPUT 절에서 반환된 열 중 삽입할 열을 지정하는 쉼표로 구분된 목록입니다. <select_list>의 열은 값을 삽입할 대상 열과 호환되어야 합니다. <select_list>는 집계 함수 또는 TEXTPTR을 참조할 수 없습니다.[!참고]
SELECT 목록에 나열된 모든 변수는 <dml_statement_with_output_clause>의 변경 내용에 관계없이 원본 값을 참조합니다.
<dml_statement_with_output_clause>
OUTPUT 절에서 영향을 받는 행을 반환하는 유효한 INSERT, UPDATE, DELETE 또는 MERGE 문입니다. 이 문은 WITH 절을 포함할 수 없으며 원격 테이블 또는 분할 뷰를 대상으로 할 수 없습니다. UPDATE 또는 DELETE가 지정된 경우 커서 기반의 UPDATE 또는 DELETE일 수 없습니다. 원본 행은 중첩된 DML 문으로 참조될 수 없습니다.WHERE <search_condition>
<dml_statement_with_output_clause>에서 반환된 행을 필터링하는 유효한 <search_condition>을 포함하는 WHERE 절입니다. 자세한 내용은 검색 조건(Transact-SQL)을 참조하십시오. 이 컨텍스트에서 사용할 경우 <search_condition>은 하위 쿼리, 데이터 액세스를 수행하는 스칼라 사용자 정의 함수, 집계 함수, TEXTPTR 또는 전체 텍스트 검색 조건자를 포함할 수 없습니다.DEFAULT VALUES
새 행이 각 열에 대해 정의된 기본값을 포함하도록 설정합니다.BULK
이진 데이터 스트림을 업로드하기 위해 외부 도구에서 사용됩니다. 이 옵션은 SQL Server Management Studio, SQLCMD, OSQL과 같은 도구나 SQL Server Native Client와 같은 데이터 액세스 응용 프로그래밍 인터페이스에 사용할 수 없습니다.FIRE_TRIGGERS
이진 데이터 스트림 업로드 작업 중에 대상 테이블에 정의된 삽입 트리거가 실행되도록 지정합니다. 자세한 내용은 BULK INSERT(Transact-SQL)를 참조하십시오.CHECK_CONSTRAINTS
이진 데이터 스트림 업로드 작업 중에 대상 테이블 또는 뷰의 모든 제약 조건을 검사하도록 지정합니다. 자세한 내용은 BULK INSERT(Transact-SQL)를 참조하십시오.KEEPNULLS
이진 데이터 스트림 업로드 작업 중에 빈 열이 Null 값을 유지하도록 지정합니다. 자세한 내용은 대량 가져오기 수행 중 Null 유지 또는 기본값 사용을 참조하십시오.KILOBYTES_PER_BATCH = kilobytes_per_batch
일괄 처리당 데이터의 근사치 크기(KB)를 kilobytes_per_batch로 지정합니다. 자세한 내용은 BULK INSERT(Transact-SQL)를 참조하십시오.ROWS_PER_BATCH =rows_per_batch
이진 데이터 스트림의 데이터 행 수를 대략적으로 나타냅니다. 자세한 내용은 BULK INSERT(Transact-SQL)를 참조하십시오.참고 열 목록이 제공되지 않으면 구문 오류가 발생합니다.
최선의 구현 방법
@@ROWCOUNT 함수를 사용하여 클라이언트에 삽입된 행의 수를 반환할 수 있습니다. 자세한 내용은 @@ROWCOUNT(Transact-SQL)를 참조하십시오.
데이터 대량 가져오기에 대한 최상의 방법
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 힌트는 트리거 실행을 일시적으로 해제할 수 있습니다.
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 문이 중지되고 행이 로드되지 않습니다.
식 평가 중에 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의 이후 버전에서는 SET ROWCOUNT 옵션을 사용해도 DELETE, INSERT 및 UPDATE 문에 영향을 주지 않습니다. 새 개발 작업에서는 DELETE, INSERT 및 UPDATE 문에 SET ROWCOUNT 옵션을 사용하지 않도록 하고 현재 이 옵션을 사용하는 응용 프로그램은 수정하십시오. 대신 TOP 절을 사용하는 것이 좋습니다. |
잠금 동작
INSERT 문은 항상 수정하는 테이블에 대해 배타적(X) 잠금을 획득하고 해당 트랜잭션이 완료될 때까지 이 잠금을 보유합니다. 배타(X) 잠금을 사용하면 다른 트랜잭션이 데이터를 수정할 수 없습니다. 읽기 작업은 NOLOCK 힌트 또는 READ UNCOMMITED 격리 수준을 사용해서만 수행할 수 있습니다. 자세한 내용은 데이터베이스 엔진에서의 잠금을 참조하십시오.
로깅 동작
OPENROWSET 함수에 BULK 키워드를 사용하는 경우 또는 INSERT INTO <target_table> SELECT <columns> FROM <source_table>을 사용하는 경우를 제외하고 INSERT 문은 항상 모두 기록됩니다. 이러한 작업을 최소한으로 기록할 수 있습니다. 자세한 내용은 이 항목의 앞부분에 나오는 "데이터 대량 로드를 위한 최상의 방법" 섹션을 참조하십시오.
보안
연결된 서버 연결이 진행되는 동안 보내는 서버는 연결된 서버 대신 로그인 이름과 암호를 제공하여 받는 서버에 연결합니다. 이 연결이 작동하려면 sp_addlinkedsrvlogin을 사용하여 연결된 서버 간의 로그인 매핑을 만들어야 합니다. 자세한 내용은 연결된 서버의 보안을 참조하십시오.
OPENROWSET(BULK…)을 사용할 때는 SQL Server에서 가장을 처리하는 방식을 이해하는 것이 중요합니다. 자세한 내용은 BULK INSERT 또는 OPENROWSET(BULK...)를 사용하여 데이터 대량 가져오기의 "보안 고려 사항"을 참조하십시오.
사용 권한
대상 테이블에 대해 INSERT 권한이 필요합니다.
INSERT 권한은 sysadmin 고정 서버 역할, db_owner 및 db_datawriter 고정 데이터베이스 역할의 멤버와 테이블 소유자에게 기본적으로 부여됩니다. sysadmin, db_owner 및 db_securityadmin 역할의 멤버와 테이블 소유자는 다른 사용자에게 권한을 위임할 수 있습니다.
OPENROWSET 함수에 BULK 옵션을 사용하여 INSERT를 실행하려면 sysadmin 또는 bulkadmin 고정 서버 역할의 멤버여야 합니다.