INSERT(Transact-SQL)INSERT (Transact-SQL)

적용 대상: 예SQL Server(2008부터) 예Azure SQL Database 예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SQL ServerSQL Server에서 테이블 또는 뷰에 새 행을 하나 이상 추가합니다.Adds one or more rows to a table or a view in SQL ServerSQL Server. 예제를 보려면 예제를 참조하세요.For examples, see Examples.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

-- Syntax for SQL Server and Azure SQL Database  

[ 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 ] ) ]  
-- External tool only syntax  

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 ]  
    ) ]  
}  
  
[; ] <column_definition> ::=  
 column_name <data_type>  
    [ COLLATE collation_name ]  
    [ NULL | NOT NULL ]  
  
<data type> ::=   
[ type_schema_name . ] type_name   
    [ ( precision [ , scale ] | max ]  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

INSERT INTO [ database_name . [ schema_name ] . | schema_name . ] table_name   
    [ ( column_name [ ,...n ] ) ]  
    {   
      VALUES ( { NULL | expression } )  
      | SELECT <select_criteria>  
    }  
    [ OPTION ( <query_option> [ ,...n ] ) ]  
[;]  

인수Arguments

WITH <common_table_expression>WITH <common_table_expression>
INSERT 문의 범위 내에 정의되는 임시로 명명된 결과 집합(공통 테이블 식이라고도 함)을 지정합니다.Specifies the temporary named result set, also known as common table expression, defined within the scope of the INSERT statement. 결과 집합은 SELECT 문에서 파생됩니다.The result set is derived from a SELECT statement. 자세한 내용은 WITH common_table_expression(Transact-SQL)을 참조하세요.For more information, see WITH common_table_expression (Transact-SQL).

TOP (expression) [ PERCENT ]TOP (expression) [ PERCENT ]
삽입할 임의 행의 수 또는 비율을 지정합니다.Specifies the number or percent of random rows that will be inserted. expression 은 행의 수 또는 비율일 수 있습니다.expression can be either a number or a percent of the rows. 자세한 내용은 TOP(Transact-SQL)을 참조하세요.For more information, see TOP (Transact-SQL).

INTOINTO
INSERT와 대상 테이블 사이에 사용할 수 있는 선택적 키워드입니다.Is an optional keyword that can be used between INSERT and the target table.

server_nameserver_name
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

테이블 또는 뷰가 있는 연결된 서버의 이름입니다.Is the name of the linked server on which the table or view is located. server_name연결된 서버 이름으로 지정하거나 OPENDATASOURCE 함수를 사용하여 지정할 수 있습니다.server_name can be specified as a linked server name, or by using the OPENDATASOURCE function.

server_name이 연결된 서버로 지정되면 database_nameschema_name이 필요합니다.When server_name is specified as a linked server, database_name and schema_name are required. OPENDATASOURCE를 사용하여 server_name을 지정할 경우 database_nameschema_name은 일부 데이터 원본에 적용되지 않을 수도 있으며 원격 개체에 액세스하는 OLE DB 공급자 기능에 따라 달라집니다.When server_name is specified with OPENDATASOURCE, database_name and schema_name may not apply to all data sources and is subject to the capabilities of the OLE DB provider that accesses the remote object.

database_namedatabase_name
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

데이터베이스의 이름입니다.Is the name of the database.

schema_nameschema_name
테이블이나 뷰가 속한 스키마의 이름입니다.Is the name of the schema to which the table or view belongs.

table_or view_nametable_or view_name
데이터를 받는 테이블 또는 뷰의 이름입니다.Is the name of the table or view that is to receive the data.

해당 범위 내에서 table 변수를 INSERT 문의 테이블 원본으로 사용할 수 있습니다.A table variable, within its scope, can be used as a table source in an INSERT statement.

table_or_view_name에서 참조되는 뷰는 업데이트가 가능해야 하며 해당 뷰의 FROM 절에서 정확히 하나의 기본 테이블을 참조해야 합니다.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. 예를 들어 여러 테이블 뷰에 대한 INSERT에는 하나의 기본 테이블에서만 열을 참조하는 column_list를 사용해야 합니다.For example, an INSERT into a multi-table view must use a column_list that references only columns from one base table. 업데이트할 수 있는 뷰에 대한 자세한 내용은 CREATE VIEW (Transact-SQL)를 참조하세요.For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

OPENQUERY 또는 OPENROWSET 함수입니다.Is either the OPENQUERY or OPENROWSET function. 이러한 함수의 사용은 원격 개체에 액세스하는 OLE DB 공급자의 기능에 영향을 받습니다.Use of these functions is subject to the capabilities of the OLE DB provider that accesses the remote object.

WITH ( <table_hint_limited> [... n ] )WITH ( <table_hint_limited> [... n ] )
대상 테이블에 허용되는 하나 이상의 테이블 힌트를 지정합니다.Specifies one or more table hints that are allowed for a target table. WITH 키워드와 괄호가 필요합니다.The WITH keyword and the parentheses are required.

READPAST, NOLOCK 및 READUNCOMMITTED는 허용되지 않습니다.READPAST, NOLOCK, and READUNCOMMITTED are not allowed. 테이블 힌트에 대한 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하세요.For more information about table hints, see Table Hints (Transact-SQL).

중요

INSERT 문의 대상 테이블에 HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD 또는 UPDLOCK 힌트를 지정하는 기능은 이후 버전의 SQL ServerSQL Server에서 제거될 예정입니다.The ability to specify the HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD, or UPDLOCK hints on tables that are targets of INSERT statements will be removed in a future version of SQL ServerSQL Server. 이러한 힌트는 INSERT 문의 성능에 영향을 주지 않습니다.These hints do not affect the performance of INSERT statements. 향후 개발 작업에서는 이러한 힌트를 사용하지 않도록 하고 현재 이 힌트를 사용하는 응용 프로그램은 수정하세요.Avoid using them in new development work, and plan to modify applications that currently use them.

INSERT 문의 대상 테이블에 TABLOCK 힌트를 지정하는 것은 TABLOCKX 힌트를 지정하는 것과 결과가 같습니다.Specifying the TABLOCK hint on a table that is the target of an INSERT statement has the same effect as specifying the TABLOCKX hint. 두 경우 모두 테이블이 배타적으로 잠깁니다.An exclusive lock is taken on the table.

(column_list)(column_list)
데이터를 삽입할 하나 이상의 열 목록입니다.Is a list of one or more columns in which to insert data. column_list는 괄호로 묶고 쉼표로 구분해야 합니다.column_list must be enclosed in parentheses and delimited by commas.

열이 column_list에 없는 경우 데이터베이스 엔진Database Engine에서는 열 정의에 따라 값을 제공할 수 있어야 합니다. 그렇지 않으면 행을 로드할 수 없습니다.If a column is not in column_list, the 데이터베이스 엔진Database Engine must be able to provide a value based on the definition of the column; otherwise, the row cannot be loaded. 열이 다음과 같은 경우에는 데이터베이스 엔진Database Engine에서 자동으로 열의 값을 제공합니다.The 데이터베이스 엔진Database Engine automatically provides a value for the column if the column:

  • IDENTITY 속성이 있는 경우.Has an IDENTITY property. 다음 증분 ID 값이 사용됩니다.The next incremental identity value is used.

  • 기본값이 있는 경우.Has a default. 열의 기본값이 사용됩니다.The default value for the column is used.

  • timestamp 데이터 형식이 있는 경우.Has a timestamp data type. 현재 타임스탬프 값이 사용됩니다.The current timestamp value is used.

  • Null을 허용합니다.Is nullable. Null 값이 사용됩니다.A null value is used.

  • 계산 열입니다.Is a computed column. 계산된 값이 사용됩니다.The calculated value is used.

명시적인 값을 ID 열에 삽입할 경우 반드시 column_list를 사용해야 하며 테이블에 대해 SET IDENTITY_INSERT 옵션을 ON으로 설정해야 합니다.column_list must be used when explicit values are inserted into an identity column, and the SET IDENTITY_INSERT option must be ON for the table.

OUTPUT ClauseOUTPUT Clause
삽입 작업의 일부로 삽입된 행을 반환합니다.Returns inserted rows as part of the insert operation. 결과는 처리 중인 응용 프로그램에 반환되거나 다음 처리를 위해 테이블 또는 테이블 변수에 삽입될 수 있습니다.The results can be returned to the processing application or inserted into a table or table variable for further processing.

로컬 분할 뷰, 분산형 분할 뷰 또는 원격 테이블을 참조하는 DML 문이나 execute_statement를 포함하는 INSERT 문에서는 OUTPUT 절이 지원되지 않습니다.The OUTPUT clause is not supported in DML statements that reference local partitioned views, distributed partitioned views, or remote tables, or INSERT statements that contain an execute_statement. OUTPUT INTO 절은 <dml_table_source> 절이 포함된 INSERT 문에서 지원되지 않습니다.The OUTPUT INTO clause is not supported in INSERT statements that contain a <dml_table_source> clause.

VALUESVALUES
삽입할 데이터 값의 목록을 표시합니다.Introduces the list or lists of data values to be inserted. column_list(지정된 경우) 또는 테이블의 각 열에 대해 하나의 데이터 값이 있어야 합니다.There must be one data value for each column in column_list, if specified, or in the table. 값 목록은 괄호로 묶어야 합니다.The value list must be enclosed in parentheses.

값 목록의 값이 테이블의 열 순서와 다르거나 테이블의 각 열에 상응하는 값이 목록에 없으면 column_list를 사용하여 각각의 들어오는 값을 저장하는 열을 명시적으로 지정해야 합니다.If the values in the Value list are not in the same order as the columns in the table or do not have a value for each column in the table, column_list must be used to explicitly specify the column that stores each incoming value.

Transact-SQLTransact-SQL 행 생성자(테이블 값 생성자라고도 함)를 사용하여 하나의 INSERT 문에 여러 행을 지정할 수 있습니다.You can use the Transact-SQLTransact-SQL row constructor (also called a table value constructor) to specify multiple rows in a single INSERT statement. 행 생성자는 여러 개의 값 목록을 괄호로 묶고 쉼표로 구분한 하나의 VALUES 절로 구성됩니다.The row constructor consists of a single VALUES clause with multiple value lists enclosed in parentheses and separated by a comma. 자세한 내용은 테이블 값 생성자(Transact-SQL)를 참조하세요.For more information, see Table Value Constructor (Transact-SQL).

DEFAULTDEFAULT
데이터베이스 엔진Database Engine에서 열에 대해 정의된 기본값을 로드하도록 설정합니다.Forces the 데이터베이스 엔진Database Engine to load the default value defined for a column. 열에 대한 기본값이 없고 열에 Null 값을 사용할 수 있는 경우에는 NULL이 삽입됩니다.If a default does not exist for the column and the column allows null values, NULL is inserted. timestamp 데이터 형식으로 정의된 열의 경우에는 다음 타임스탬프 값이 삽입됩니다.For a column defined with the timestamp data type, the next timestamp value is inserted. ID 열에는 DEFAULT를 사용할 수 없습니다.DEFAULT is not valid for an identity column.

expressionexpression
상수, 변수 또는 식입니다.Is a constant, a variable, or an expression. 식은 EXECUTE 문을 포함할 수 없습니다.The expression cannot contain an EXECUTE statement.

nchar, nvarcharntext 유니코드 문자 데이터 형식을 참조할 때는 'expression' 앞에 대문자 'N'이 접두사로 와야 합니다.When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. 'N'을 지정하지 않으면 SQL ServerSQL Server에서 데이터베이스 또는 열의 기본 데이터 정렬에 해당하는 코드 페이지로 문자열을 변환합니다.If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. 이 코드 페이지에 없는 문자는 모두 손실됩니다.Any characters not found in this code page are lost.

derived_tablederived_table
테이블에 로드할 데이터 행을 반환하는 유효한 SELECT 문입니다.Is any valid SELECT statement that returns rows of data to be loaded into the table. SELECT 문은 CTE(공통 테이블 식)를 포함할 수 없습니다.The SELECT statement cannot contain a common table expression (CTE).

execute_statementexecute_statement
SELECT 또는 READTEXT 문을 사용하여 데이터를 반환하는 유효한 EXECUTE 문입니다.Is any valid EXECUTE statement that returns data with SELECT or READTEXT statements. 자세한 내용은 EXECUTE(Transact-SQL)을 참조하세요.For more information, see EXECUTE (Transact-SQL).

INSERT...EXEC 문에서 EXECUTE 문의 RESULT SETS 옵션을 지정할 수 없습니다.The RESULT SETS options of the EXECUTE statement cannot be specified in an INSERT...EXEC statement.

execute_statement를 INSERT에 사용하는 경우 각 결과 집합은 테이블 또는 column_list의 열과 호환되어야 합니다.If execute_statement is used with INSERT, each result set must be compatible with the columns in the table or in column_list.

execute_statement를 사용하여 같은 서버 또는 원격 서버에서 저장 프로시저를 실행할 수 있습니다.execute_statement can be used to execute stored procedures on the same server or a remote server. 원격 서버에서 프로시저를 실행하면 결과 집합이 로컬 서버에 반환되어 로컬 서버의 테이블에 로드됩니다.The procedure in the remote server is executed, and the result sets are returned to the local server and loaded into the table in the local server. 연결에 MARS(Multiple Active Result Sets)가 설정된 경우에는 분산 트랜잭션에서 루프백 연결된 서버에 대해 execute_statement를 실행할 수 없습니다.In a distributed transaction, execute_statement cannot be issued against a loopback linked server when the connection has multiple active result sets (MARS) enabled.

execute_statement에서 READTEXT 문을 사용하여 데이터를 반환하는 경우 각 READTEXT 문은 최대 1MB(1024KB)의 데이터를 반환할 수 있습니다.If execute_statement returns data with the READTEXT statement, each READTEXT statement can return a maximum of 1 MB (1024 KB) of data. 또한 execute_statement를 확장 프로시저에 사용할 수도 있습니다.execute_statement can also be used with extended procedures. execute_statement는 확장 프로시저의 주 스레드에서 반환하는 데이터는 삽입하지만 주 스레드를 제외한 스레드의 출력은 삽입되지 않습니다.execute_statement inserts the data returned by the main thread of the extended procedure; however, output from threads other than the main thread are not inserted.

테이블 반환 매개 변수를 INSERT EXEC 문의 대상으로 지정할 수는 없지만 INSERT EXEC 문자열 또는 저장 프로시저의 원본으로 지정할 수 있습니다.You cannot specify a table-valued parameter as the target of an INSERT EXEC statement; however, it can be specified as a source in the INSERT EXEC string or stored-procedure. 자세한 내용은 테이블 반환 매개 변수 사용(데이터베이스 엔진)을 참조하세요.For more information, see Use Table-Valued Parameters (Database Engine).

<dml_table_source><dml_table_source>
INSERT, UPDATE, DELETE 또는 MERGE 문의 OUTPUT 절에서 반환하고 선택적으로 WHERE 절로 필터링되는 행이 대상 테이블에 삽입되도록 지정합니다.Specifies that the rows inserted into the target table are those returned by the OUTPUT clause of an INSERT, UPDATE, DELETE, or MERGE statement, optionally filtered by a WHERE clause. <dml_table_source>를 지정한 경우 외부 INSERT 문의 대상은 다음 제한 사항을 충족해야 합니다.If <dml_table_source> is specified, the target of the outer INSERT statement must meet the following restrictions:

  • 뷰가 아니라 기본 테이블이어야 합니다.It must be a base table, not a view.

  • 원격 테이블일 수 없습니다.It cannot be a remote table.

  • 정의된 트리거를 포함할 수 없습니다.It cannot have any triggers defined on it.

  • 기본 키-외래 키 관계에 참여할 수 없습니다.It cannot participate in any primary key-foreign key relationships.

  • 트랜잭션 복제에 대한 병합 복제 또는 업데이트할 수 있는 구독에 참여할 수 없습니다.It cannot participate in merge replication or updatable subscriptions for transactional replication.

데이터베이스의 호환성 수준이 100 이상으로 설정되어야 합니다.The compatibility level of the database must be set to 100 or higher. 자세한 내용은 OUTPUT Clause(Transact-SQL)를 참조하세요.For more information, see OUTPUT Clause (Transact-SQL).

<select_list><select_list>
OUTPUT 절에서 반환된 열 중 삽입할 열을 지정하는 쉼표로 구분된 목록입니다.Is a comma-separated list specifying which columns returned by the OUTPUT clause to insert. <select_list>의 열은 값이 삽입되는 열과 호환되어야 합니다.The columns in <select_list> must be compatible with the columns into which values are being inserted. <select_list>는 집계 함수 또는 TEXTPTR을 참조할 수 없습니다.<select_list> cannot reference aggregate functions or TEXTPTR.

참고

SELECT 목록에 나열된 모든 변수는 <dml_statement_with_output_clause>의 변경 내용에 관계없이 원본 값을 참조합니다.Any variables listed in the SELECT list refer to their original values, regardless of any changes made to them in <dml_statement_with_output_clause>.

<dml_statement_with_output_clause><dml_statement_with_output_clause>
OUTPUT 절에서 영향을 받는 행을 반환하는 유효한 INSERT, UPDATE, DELETE 또는 MERGE 문입니다.Is a valid INSERT, UPDATE, DELETE, or MERGE statement that returns affected rows in an OUTPUT clause. 이 문은 WITH 절을 포함할 수 없으며 원격 테이블 또는 분할 뷰를 대상으로 할 수 없습니다.The statement cannot contain a WITH clause, and cannot target remote tables or partitioned views. UPDATE 또는 DELETE가 지정된 경우 커서 기반의 UPDATE 또는 DELETE일 수 없습니다.If UPDATE or DELETE is specified, it cannot be a cursor-based UPDATE or DELETE. 원본 행은 중첩된 DML 문으로 참조될 수 없습니다.Source rows cannot be referenced as nested DML statements.

WHERE <search_condition>WHERE <search_condition>
<dml_statement_with_output_clause>에서 반환된 행을 필터링하는 유효한 <search_condition>을 포함하는 WHERE 절입니다.Is any WHERE clause containing a valid <search_condition> that filters the rows returned by <dml_statement_with_output_clause>. 자세한 내용은 검색 조건(Transact-SQL)을 참조하세요.For more information, see Search Condition (Transact-SQL). 이 컨텍스트에서 사용할 경우 <search_condition>은 하위 쿼리, 데이터 액세스를 수행하는 스칼라 사용자 정의 함수, 집계 함수, TEXTPTR 또는 전체 텍스트 검색 조건자를 포함할 수 없습니다.When used in this context, <search_condition> cannot contain subqueries, scalar user-defined functions that perform data access, aggregate functions, TEXTPTR, or full-text search predicates.

DEFAULT VALUESDEFAULT VALUES
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

새 행이 각 열에 대해 정의된 기본값을 포함하도록 설정합니다.Forces the new row to contain the default values defined for each column.

BULKBULK
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

이진 데이터 스트림을 업로드하기 위해 외부 도구에서 사용됩니다.Used by external tools to upload a binary data stream. 이 옵션은 SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL과 같은 도구나 SQL ServerSQL Server Native Client와 같은 데이터 액세스 애플리케이션 프로그래밍 인터페이스에 사용할 수 없습니다.This option is not intended for use with tools such as SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL, or data access application programming interfaces such as SQL ServerSQL Server Native Client.

FIRE_TRIGGERSFIRE_TRIGGERS
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

이진 데이터 스트림 업로드 작업 중에 대상 테이블에 정의된 삽입 트리거가 실행되도록 지정합니다.Specifies that any insert triggers defined on the destination table execute during the binary data stream upload operation. 자세한 내용은 BULK INSERT(Transact-SQL)를 참조하세요.For more information, see BULK INSERT (Transact-SQL).

CHECK_CONSTRAINTSCHECK_CONSTRAINTS
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

이진 데이터 스트림 업로드 작업 중에 대상 테이블 또는 뷰의 모든 제약 조건을 검사하도록 지정합니다.Specifies that all constraints on the target table or view must be checked during the binary data stream upload operation. 자세한 내용은 BULK INSERT(Transact-SQL)를 참조하세요.For more information, see BULK INSERT (Transact-SQL).

KEEPNULLSKEEPNULLS
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

이진 데이터 스트림 업로드 작업 중에 빈 열이 Null 값을 유지하도록 지정합니다.Specifies that empty columns should retain a null value during the binary data stream upload operation. 자세한 내용은 대량 가져오기 수행 중 Null 유지 또는 기본값 사용(SQL Server)을 참조하세요.For more information, see Keep Nulls or Use Default Values During Bulk Import (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batchKILOBYTES_PER_BATCH = kilobytes_per_batch
일괄 처리당 데이터의 근사치 크기(KB)를 kilobytes_per_batch로 지정합니다.Specifies the approximate number of kilobytes (KB) of data per batch as kilobytes_per_batch. 자세한 내용은 BULK INSERT(Transact-SQL)를 참조하세요.For more information, see BULK INSERT (Transact-SQL).

ROWS_PER_BATCH =rows_per_batchROWS_PER_BATCH =rows_per_batch
적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

이진 데이터 스트림의 데이터 행 수를 대략적으로 나타냅니다.Indicates the approximate number of rows of data in the binary data stream. 자세한 내용은 BULK INSERT(Transact-SQL)를 참조하세요.For more information, see BULK INSERT (Transact-SQL).

참고

열 목록이 제공되지 않으면 구문 오류가 발생합니다.A syntax error is raised if a column list is not provided.

RemarksRemarks

SQL 그래프 테이블에 데이터를 삽입하는 방법에 대한 자세한 내용은 INSERT(SQL Graph)를 참조하세요.For information specific to inserting data into SQL graph tables, see INSERT (SQL Graph).

최선의 구현 방법Best Practices

@@ROWCOUNT 함수를 사용하여 클라이언트 애플리케이션에 삽입된 행의 수를 반환할 수 있습니다.Use the @@ROWCOUNT function to return the number of inserted rows to the client application. 자세한 내용은 @@ROWCOUNT&#40;Transact-SQL&#41;을 참조하세요.For more information, see @@ROWCOUNT (Transact-SQL).

데이터 대량 가져오기에 대한 최선의 구현 방법Best Practices for Bulk Importing Data

INSERT INTO...SELECT를 사용하여 최소 로깅으로 데이터 대량 가져오기Using INSERT INTO...SELECT to Bulk Import Data with Minimal Logging

INSERT INTO <target_table> SELECT <columns> FROM <source_table>을 사용하여 최소 로깅으로 준비 테이블과 같은 한 테이블에서 다른 테이블로 다수의 행을 효율적으로 전송할 수 있습니다.You can use INSERT INTO <target_table> SELECT <columns> FROM <source_table> to efficiently transfer a large number of rows from one table, such as a staging table, to another table with minimal logging. 최소 로깅은 문의 성능을 향상시키고 트랜잭션 중에 사용 가능한 트랜잭션 로그 공간을 꽉 채울 가능성을 줄일 수 있습니다.Minimal logging can improve the performance of the statement and reduce the possibility of the operation filling the available transaction log space during the transaction.

이 문의 최소 로깅을 위해서는 다음 요구 사항이 충족되어야 합니다.Minimal logging for this statement has the following requirements:

  • 데이터베이스의 복구 모델이 단순 또는 대량 로그로 설정되어야 합니다.The recovery model of the database is set to simple or bulk-logged.

  • 대상 테이블은 비어 있거나 비어 있지 않은 힙이어야 합니다.The target table is an empty or nonempty heap.

  • 대상 테이블이 복제에 사용되지 않아야 합니다.The target table is not used in replication.

  • TABLOCK 힌트가 대상 테이블에 지정되어야 합니다.The TABLOCK hint is specified for the target table.

MERGE 문의 삽입 동작 결과로 힙에 삽입되는 행도 최소 로깅이 가능합니다.Rows that are inserted into a heap as the result of an insert action in a MERGE statement may also be minimally logged.

덜 제한적인 대량 업데이트 잠금을 보유하는 BULK INSERT 문과 달리 TABLOCK 힌트를 사용하는 INSERT INTO...SELECT 문은 테이블에 대해 배타적(X) 잠금을 보유합니다.Unlike the BULK INSERT statement, which holds a less restrictive Bulk Update lock, INSERT INTO...SELECT with the TABLOCK hint holds an exclusive (X) lock on the table. 즉, 병렬 삽입 작업을 사용하여 행을 삽입할 수 없습니다.This means that you cannot insert rows using parallel insert operations.

OPENROWSET 및 BULK를 사용하여 데이터 대량 가져오기Using OPENROWSET and BULK to Bulk Import Data

OPENROWSET 함수에는 INSERT 문을 사용하여 대량 로드 최적화를 제공하는 다음과 같은 테이블 힌트를 사용할 수 있습니다.The OPENROWSET function can accept the following table hints, which provide bulk-load optimizations with the INSERT statement:

  • TABLOCK 힌트는 삽입 작업에 대한 로그 레코드의 수를 최소화할 수 있습니다.The TABLOCK hint can minimize the number of log records for the insert operation. 데이터베이스 복구 모델은 단순 또는 대량 로그로 설정되어야 하며 대상 테이블은 복제에 사용될 수 없습니다.The recovery model of the database must be set to simple or bulk-logged and the target table cannot be used in replication. 자세한 내용은 대량 가져오기의 최소 로깅을 위한 필수 조건을 참조하세요.For more information, see Prerequisites for Minimal Logging in Bulk Import.

  • IGNORE_CONSTRAINTS 힌트는 FOREIGN KEY 및 CHECK 제약 조건 검사를 일시적으로 해제할 수 있습니다.The IGNORE_CONSTRAINTS hint can temporarily disable FOREIGN KEY and CHECK constraint checking.

  • IGNORE_TRIGGERS 힌트는 트리거 실행을 일시적으로 해제할 수 있습니다.The IGNORE_TRIGGERS hint can temporarily disable trigger execution.

  • KEEPDEFAULTS 힌트를 사용하면 데이터 레코드에 열 값이 없는 경우 NULL 대신 테이블 열의 기본값(있는 경우)을 삽입할 수 있습니다.The KEEPDEFAULTS hint allows the insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

  • KEEPIDENTITY 힌트를 사용하면 가져온 데이터 파일의 ID 값을 대상 테이블의 ID 열에 사용할 수 있습니다.The KEEPIDENTITY hint allows the identity values in the imported data file to be used for the identity column in the target table.

이러한 최적화는 BULK INSERT 명령에서 사용할 수 있는 최적화와 비슷합니다.These optimizations are similar to those available with the BULK INSERT command. 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하세요.For more information, see Table Hints (Transact-SQL).

데이터 형식Data Types

행을 삽입할 때는 다음과 같은 데이터 형식 동작을 고려해야 합니다.When you insert rows, consider the following data type behavior:

  • char, varchar 또는 varbinary 데이터 형식을 사용하는 열에 값을 로드하는 경우 후행 공백(charvarchar의 경우 공백, varbinary의 경우 0)의 잘라내기 또는 채우기는 테이블을 만들 때 열에 정의된 SET ANSI_PADDING 설정에 따라 결정됩니다.If a value is being loaded into columns with a char, varchar, or varbinary data type, the padding or truncation of trailing blanks (spaces for char and varchar, zeros for varbinary) is determined by the SET ANSI_PADDING setting defined for the column when the table was created. 자세한 내용은 SET ANSI_PADDING(Transact-SQL)을 참조하세요.For more information, see SET ANSI_PADDING (Transact-SQL).

    다음 표에서는 SET ANSI_PADDING이 OFF일 때의 기본 작업을 보여 줍니다.The following table shows the default operation for SET ANSI_PADDING OFF.

    데이터 형식Data type 기본 작업Default operation
    charchar 정의된 열 너비만큼 공백으로 값을 채웁니다.Pad value with spaces to the defined width of column.
    varcharvarchar 공백이 아닌 마지막 문자 또는 단일 공백 문자(공백으로만 구성된 문자열의 경우)에 대한 후행 공백을 제거합니다.Remove trailing spaces to the last non-space character or to a single-space character for strings made up of only spaces.
    varbinaryvarbinary 후행 0을 제거합니다.Remove trailing zeros.
  • varchar 또는 text 데이터 형식을 사용하는 열에 빈 문자열(' ')이 로드될 경우에는 기본적으로 길이가 0인 문자열이 로드됩니다.If an empty string (' ') is loaded into a column with a varchar or text data type, the default operation is to load a zero-length string.

  • text 또는 image 열에 Null 값을 삽입하면 유효한 텍스트 포인터가 생성되지 않고 8KB 텍스트 페이지도 사전 할당되지 않습니다.Inserting a null value into a text or image column does not create a valid text pointer, nor does it preallocate an 8-KB text page.

  • uniqueidentifier 데이터 형식으로 만든 열은 특별한 형식이 지정된 16바이트 이진 값을 저장합니다.Columns created with the uniqueidentifier data type store specially formatted 16-byte binary values. ID 열과 달리 uniqueidentifier 데이터 형식을 사용하는 열에 대해 데이터베이스 엔진Database Engine에서 자동으로 값을 생성하지 않습니다.Unlike with identity columns, the 데이터베이스 엔진Database Engine does not automatically generate values for columns with the uniqueidentifier data type. 삽입 작업 중에는 uniqueidentifier 열에 uniqueidentifier 데이터 형식의 변수 및 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(하이픈을 포함하여 36자, x는 0-9 또는 a-f 범위의 16진수) 형식의 문자열 상수를 사용할 수 있습니다.During an insert operation, variables with a data type of uniqueidentifier and string constants in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 characters including hyphens, where x is a hexadecimal digit in the range 0-9 or a-f) can be used for uniqueidentifier columns. 예를 들어 6F9619FF-8B86-D011-B42D-00C04FC964FF는 uniqueidentifier 변수 또는 열의 유효한 값입니다.For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid value for a uniqueidentifier variable or column. GUID(Globally Unique Identifier)를 가져오려면 NEWID() 함수를 사용하세요.Use the NEWID() function to obtain a globally unique ID (GUID).

사용자 정의 형식 열에 값 삽입Inserting Values into User-Defined Type Columns

다음과 같은 방법으로 사용자 정의 형식 열에 값을 삽입할 수 있습니다.You can insert values in user-defined type columns by:

  • 사용자 정의 형식의 값을 제공합니다.Supplying a value of the user-defined type.

  • 사용자 정의 형식에서 SQL ServerSQL Server 시스템 데이터 형식의 암시적 또는 명시적 변환이 지원되는 경우 해당 형식의 값을 제공합니다.Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. 다음 예에서는 문자열에서 명시적으로 변환하여 사용자 정의 형식 Point의 열에 값을 삽입하는 방법을 보여줍니다.The following example shows how to insert a value in a column of user-defined type Point, by explicitly converting from a string.

    INSERT INTO Cities (Location)  
    VALUES ( CONVERT(Point, '12.3:46.2') );  
    

    모든 사용자 정의 형식은 이진 형식에서 암시적으로 변환할 수 있으므로 명시적 변환을 수행하지 않고도 이진 값을 제공할 수 있습니다.A binary value can also be supplied without performing explicit conversion, because all user-defined types are implicitly convertible from binary.

  • 사용자 정의 형식의 값을 반환하는 사용자 정의 함수를 호출합니다.Calling a user-defined function that returns a value of the user-defined type. 다음 예에서는 사용자 정의 함수 CreateNewPoint()를 사용하여 사용자 정의 형식 Point의 새 값을 만들고 이 값을 Cities 테이블에 삽입합니다.The following example uses a user-defined function CreateNewPoint() to create a new value of user-defined type Point and insert the value into the Cities table.

    INSERT INTO Cities (Location)  
    VALUES ( dbo.CreateNewPoint(x, y) );  
    

오류 처리Error Handling

TRY...CATCH 구문에 명령문을 지정하여 INSERT 문에 대한 오류 처리를 구현할 수 있습니다.You can implement error handling for the INSERT statement by specifying the statement in a TRY...CATCH construct.

INSERT 문이 제약 조건 또는 규칙을 위반하거나 열의 데이터 형식과 호환되지 않는 값을 포함하는 경우 문이 실패하고 오류 메시지가 반환됩니다.If an INSERT statement violates a constraint or rule, or if it has a value incompatible with the data type of the column, the statement fails and an error message is returned.

INSERT가 SELECT 또는 EXECUTE를 사용하여 여러 행을 로드하는 경우 로드되는 값 중에서 규칙 또는 제약 조건 위반이 발생하면 INSERT 문이 중지되고 행이 로드되지 않습니다.If INSERT is loading multiple rows with SELECT or EXECUTE, any violation of a rule or constraint that occurs from the values being loaded causes the statement to be stopped, and no rows are loaded.

식 평가 중에 INSERT 문에서 오버플로, 0으로 나누기 또는 도메인 오류와 같은 산술 오류가 발생하면 데이터베이스 엔진Database Engine에서는 이러한 오류를 SET ARITHABORT가 ON으로 설정된 것처럼 처리합니다.When an INSERT statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the 데이터베이스 엔진Database Engine handles these errors as if SET ARITHABORT is set to ON. 즉, 일괄 처리가 중지되고 오류 메시지가 반환됩니다.The batch is stopped, and an error message is returned. SET ARITHABORT 및 SET ANSI_WARNINGS가 OFF인 경우 식 평가 중에 INSERT, DELETE 또는 UPDATE 문에서 오버플로, 0으로 나누기 또는 도메인 오류와 같은 산술 오류가 발생하면 SQL ServerSQL Server에서 NULL 값을 삽입하거나 업데이트합니다.During expression evaluation when SET ARITHABORT and SET ANSI_WARNINGS are OFF, if an INSERT, DELETE or UPDATE statement encounters an arithmetic error, overflow, divide-by-zero, or a domain error, SQL ServerSQL Server inserts or updates a NULL value. 대상 열이 Null 허용이 아니면 삽입이나 업데이트 동작이 실패하고 사용자에게 오류 메시지가 보내집니다.If the target column is not nullable, the insert or update action fails and the user receives an error.

상호 운용성Interoperability

테이블 또는 뷰에 대한 INSERT 동작에 INSTEAD OF 트리거가 정의되면 INSERT 문 대신 트리거가 실행됩니다.When an INSTEAD OF trigger is defined on INSERT actions against a table or view, the trigger executes instead of the INSERT statement. INSTEAD OF 트리거에 대한 자세한 내용은 CREATE TRIGGER(Transact-SQL)를 참조하세요.For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

제한 사항Limitations and Restrictions

원격 테이블에 값을 삽입하는 경우 모든 열에서 지정되지 않은 값이 있으면 지정된 값을 삽입할 열을 식별해야 합니다.When you insert values into remote tables and not all values for all columns are specified, you must identify the columns to which the specified values are to be inserted.

TOP을 INSERT와 함께 사용할 경우 참조된 행은 어떠한 순서로도 정렬되지 않으며 ORDER BY 절을 이 문에서 직접 지정할 수 없습니다.When TOP is used with INSERT the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statements. TOP을 사용하여 시간 순서로 행을 삽입해야 할 경우 하위 SELECT 문에서 지정된 ORDER BY 절과 함께 TOP을 사용해야 합니다.If you need to use TOP to insert rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause that is specified in a subselect statement. 이 항목의 뒷부분에 나오는 예 섹션을 참조하세요.See the Examples section that follows in this topic.

SELECT를 ORDER BY와 함께 사용하여 행을 채우는 INSERT 쿼리는 ID 값을 계산하는 방법을 보장하지만 행이 삽입되는 순서는 보장하지 않습니다.INSERT queries that use SELECT with ORDER BY to populate rows guarantees how identity values are computed but not the order in which the rows are inserted.

병렬 데이터 웨어하우스에서 TOP을 함께 지정하지 않는 한 VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 ORDER BY 절을 사용할 수 없습니다.In Parallel Data Warehouse, the ORDER BY clause is invalid in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline functions, derived tables, subqueries and common table expressions, unless TOP is also specified.

로깅 동작Logging Behavior

INSERT 문은 OPENROWSET 함수에 BULK 키워드를 사용하는 경우 또는 INSERT INTO <target_table> SELECT <columns> FROM <source_table>을 사용하는 경우를 제외하고 항상 모두 기록됩니다.The INSERT statement is always fully logged except when using the OPENROWSET function with the BULK keyword or when using INSERT INTO <target_table> SELECT <columns> FROM <source_table>. 이러한 작업을 최소한으로 기록할 수 있습니다.These operations can be minimally logged. 자세한 내용은 이 항목의 앞부분에 나오는 "데이터 대량 로드를 위한 최선의 구현 방법" 섹션을 참조하세요.For more information, see the section "Best Practices for Bulk Loading Data" earlier in this topic.

보안Security

연결된 서버 연결이 진행되는 동안 보내는 서버는 연결된 서버 대신 로그인 이름과 암호를 제공하여 받는 서버에 연결합니다.During a linked server connection, the sending server provides a login name and password to connect to the receiving server on its behalf. 이 연결이 작동하려면 sp_addlinkedsrvlogin을 사용하여 연결된 서버 간의 로그인 매핑을 만들어야 합니다.For this connection to work, you must create a login mapping between the linked servers by using sp_addlinkedsrvlogin.

OPENROWSET(BULK...)를 사용할 경우 SQL ServerSQL Server에서 가장을 처리하는 방법을 이해하는 것이 중요합니다.When you use OPENROWSET(BULK...), it is important to understand how SQL ServerSQL Server handles impersonation. 자세한 내용은 BULK INSERT 또는 OPENROWSET(BULK...) (SQL Server)를 사용하여 데이터 대량 가져오기의 "보안 고려 사항"을 참조하세요.For more information, see "Security Considerations" in Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

PermissionsPermissions

대상 테이블에 대해 INSERT 권한이 필요합니다.INSERT permission is required on the target table.

sysadmin 고정 서버 역할, db_ownerdb_datawriter 고정 데이터베이스 역할의 멤버 및 테이블 소유자에게는 기본적으로 INSERT 권한이 부여됩니다.INSERT permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. sysadmin, db_ownerdb_securityadmin 역할의 멤버와 테이블 소유자는 다른 사용자에게 권한을 위임할 수 있습니다.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

OPENROWSET 함수에 BULK 옵션을 사용하여 INSERT를 실행하려면 sysadmin 고정 서버 역할 또는 bulkadmin 고정 서버 역할의 멤버여야 합니다.To execute INSERT with the OPENROWSET function BULK option, you must be a member of the sysadmin fixed server role or of the bulkadmin fixed server role.

Examples

범주Category 중요한 구문 요소Featured syntax elements
기본 구문Basic syntax INSERT • 테이블 값 생성자INSERT • table value constructor
열 값 처리Handling column values IDENTITY • NEWID • 기본값 • 사용자 정의 형식IDENTITY • NEWID • default values • user-defined types
다른 테이블의 데이터 삽입Inserting data from other tables INSERT...SELECT • INSERT...EXECUTE • WITH 공통 테이블 식 • TOP • OFFSET FETCHINSERT...SELECT • INSERT...EXECUTE • WITH common table expression • TOP • OFFSET FETCH
표준 테이블 이외의 대상 개체 지정Specifying target objects other than standard tables 뷰 • 테이블 변수Views • table variables
원격 테이블에 행 삽입Inserting rows into a remote table 연결된 서버 • OPENQUERY 행 집합 함수 • OPENDATASOURCE 행 집합 함수Linked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
테이블 또는 데이터 파일에서 데이터 대량 로드Bulk loading data from tables or data files INSERT...SELECT • OPENROWSET 함수INSERT...SELECT • OPENROWSET function
힌트를 사용하여 쿼리 최적화 프로그램의 기본 동작 재정의Overriding the default behavior of the query optimizer by using hints 테이블 힌트Table hints
INSERT 문의 결과 캡처Capturing the results of the INSERT statement OUTPUT 절OUTPUT clause

기본 구문Basic Syntax

이 섹션의 예에서는 최소 필수 구문을 사용하여 INSERT 문의 기본 기능을 보여 줍니다.Examples in this section demonstrate the basic functionality of the INSERT statement using the minimum required syntax.

1.A. 단일 데이터 행 삽입Inserting a single row of data

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스의 Production.UnitMeasure 테이블에 한 행을 삽입합니다.The following example inserts one row into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. 이 테이블의 열은 UnitMeasureCode, NameModifiedDate입니다.The columns in this table are UnitMeasureCode, Name, and ModifiedDate. 모든 열에 대한 값이 제공되고 테이블 내의 열과 같은 순서로 나열되어 있기 때문에 열 목록에 열 이름을 지정할 필요가 없습니다 .Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list .

INSERT INTO Production.UnitMeasure  
VALUES (N'FT', N'Feet', '20080414');  

2.B. 여러 데이터 행 삽입Inserting multiple rows of data

다음 예에서는 테이블 값 생성자를 사용하여 단일 INSERT 문으로 AdventureWorks2012AdventureWorks2012 데이터베이스의 Production.UnitMeasure 테이블에 세 개의 행을 삽입합니다.The following example uses the table value constructor to insert three rows into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database in a single INSERT statement. 모든 열에 대한 값이 제공되어 있고 값이 테이블 내의 열과 같은 순서로 나열되어 있기 때문에 열 목록에 열 이름을 지정할 필요가 없습니다.Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list.

INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
    , (N'Y3', N'Cubic Yards', '20080923');  

3.C. 테이블 열과 순서가 다른 데이터 삽입Inserting data that is not in the same order as the table columns

다음 예에서는 열 목록을 사용하여 각 열에 삽입되는 값을 명시적으로 지정합니다.The following example uses a column list to explicitly specify the values that are inserted into each column. AdventureWorks2012AdventureWorks2012 데이터베이스에 있는 Production.UnitMeasure 테이블의 열 순서는 UnitMeasureCode, Name, ModifiedDate이지만 column_list에는 열이 이 순서대로 나열되어 있지 않습니다.The column order in the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database is UnitMeasureCode, Name, ModifiedDate; however, the columns are not listed in that order in column_list.

INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,  
    ModifiedDate)  
VALUES (N'Square Yards', N'Y2', GETDATE());  

열 값 처리Handling Column Values

이 섹션의 예에서는 IDENTITY 속성, DEFAULT 값으로 정의되거나 uniqueidentifer 또는 사용자 정의 형식 열과 같은 데이터 형식으로 정의된 열에 값을 삽입하는 방법을 보여줍니다.Examples in this section demonstrate methods of inserting values into columns that are defined with an IDENTITY property, DEFAULT value, or are defined with data types such as uniqueidentifer or user-defined type columns.

D.D. 기본값을 갖는 열이 포함된 테이블에 데이터 삽입Inserting data into a table with columns that have default values

다음 예에서는 자동으로 값을 생성하거나 기본값을 갖는 열이 있는 테이블에 행을 삽입하는 방법을 보여 줍니다.The following example shows inserting rows into a table with columns that automatically generate a value or have a default value. Column_1column_2에 삽입된 값과 문자열을 연결하여 자동으로 값을 생성하는 계산 열입니다.Column_1 is a computed column that automatically generates a value by concatenating a string with the value inserted into column_2. Column_2는 기본 제약 조건으로 정의됩니다.Column_2 is defined with a default constraint. 이 열에 값이 지정되지 않으면 기본값이 사용됩니다.If a value is not specified for this column, the default value is used. Column_3은 고유한 증분 이진수를 생성하는 rowversion 데이터 형식으로 정의됩니다.Column_3 is defined with the rowversion data type, which automatically generates a unique, incrementing binary number. Column_4는 값을 자동으로 생성하지 않습니다.Column_4 does not automatically generate a value. 이 열의 값이 지정되지 않으면 NULL이 삽입됩니다.When a value for this column is not specified, NULL is inserted. INSERT 문은 전체 열이 아니라 일부 열의 값을 포함하는 행을 삽입합니다.The INSERT statements insert rows that contain values for some of the columns but not all. 마지막 INSERT 문에는 열이 지정되지 않고 DEFAULT VALUES 절을 사용하여 기본값만 삽입됩니다.In the last INSERT statement, no columns are specified and only the default values are inserted by using the DEFAULT VALUES clause.

CREATE TABLE dbo.T1   
(  
    column_1 AS 'Computed column ' + column_2,   
    column_2 varchar(30)   
        CONSTRAINT default_name DEFAULT ('my column default'),  
    column_3 rowversion,  
    column_4 varchar(40) NULL  
);  
GO  
INSERT INTO dbo.T1 (column_4)   
    VALUES ('Explicit value');  
INSERT INTO dbo.T1 (column_2, column_4)   
    VALUES ('Explicit value', 'Explicit value');  
INSERT INTO dbo.T1 (column_2)   
    VALUES ('Explicit value');  
INSERT INTO T1 DEFAULT VALUES;   
GO  
SELECT column_1, column_2, column_3, column_4  
FROM dbo.T1;  
GO  

E.E. ID 열이 있는 테이블에 데이터 삽입Inserting data into a table with an identity column

다음 예에서는 ID 열에 데이터를 삽입하는 다양한 방법을 보여 줍니다.The following example shows different methods of inserting data into an identity column. 처음 두 INSERT 문은 새 행에 대해 ID 값을 생성할 수 있도록 합니다.The first two INSERT statements allow identity values to be generated for the new rows. 세 번째 INSERT 문은 SET IDENTITY_INSERT 문으로 열의 IDENTITY 속성을 재정의하고 ID 열에 명시적 값을 삽입합니다.The third INSERT statement overrides the IDENTITY property for the column with the SET IDENTITY_INSERT statement and inserts an explicit value into the identity column.

CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30));  
GO  
INSERT T1 VALUES ('Row #1');  
INSERT T1 (column_2) VALUES ('Row #2');  
GO  
SET IDENTITY_INSERT T1 ON;  
GO  
INSERT INTO T1 (column_1,column_2)   
    VALUES (-99, 'Explicit identity value');  
GO  
SELECT column_1, column_2  
FROM T1;  
GO  

F.F. NEWID()를 사용하여 uniqueidentifier 열에 데이터 삽입Inserting data into a uniqueidentifier column by using NEWID()

다음 예에서는 NEWID() 함수를 사용하여 column_2의 GUID를 가져옵니다.The following example uses the NEWID() function to obtain a GUID for column_2. 두 번째 INSERT 문에서 볼 수 있듯이 ID 열과 달리 uniqueidentifier 데이터 형식의 열에 대해서는 데이터베이스 엔진Database Engine에서 값을 자동으로 생성하지 않습니다.Unlike for identity columns, the 데이터베이스 엔진Database Engine does not automatically generate values for columns with the uniqueidentifier data type, as shown by the second INSERT statement.

CREATE TABLE dbo.T1   
(  
    column_1 int IDENTITY,   
    column_2 uniqueidentifier,  
);  
GO  
INSERT INTO dbo.T1 (column_2)   
    VALUES (NEWID());  
INSERT INTO T1 DEFAULT VALUES;   
GO  
SELECT column_1, column_2  
FROM dbo.T1;  
  

G.G. 사용자 정의 형식 열에 데이터 삽입Inserting data into user-defined type columns

다음 Transact-SQLTransact-SQL 문은 PointValue 테이블의 Points 열에 세 개의 행을 삽입합니다.The following Transact-SQLTransact-SQL statements insert three rows into the PointValue column of the Points table. 이 열은 CLR UDT(사용자 정의 형식)를 사용합니다.This column uses a CLR user-defined type (UDT). Point 데이터 형식은 UDT 속성으로 노출되는 X 및 Y 정수 값으로 구성됩니다.The Point data type consists of X and Y integer values that are exposed as properties of the UDT. CAST 또는 CONVERT 함수를 사용하여 쉼표로 구분된 X 및 Y 값을 Point 형식으로 캐스팅해야 합니다.You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. 처음 두 명령문은 CONVERT 함수를 사용하여 문자열 값을Point 형식으로 변환하고 세 번째 명령문은 CAST 함수를 사용합니다.The first two statements use the CONVERT function to convert a string value to the Point type, and the third statement uses the CAST function. 자세한 내용은 UDT 데이터 조작을 참조하세요.For more information, see Manipulating UDT Data.

INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));  
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));  
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));  

다른 테이블의 데이터 삽입Inserting Data from Other Tables

이 섹션의 예에서는 한 테이블의 행을 다른 테이블에 삽입하는 방법을 보여 줍니다.Examples in this section demonstrate methods of inserting rows from one table into another table.

H.H. SELECT 및 EXECUTE 옵션을 사용하여 다른 테이블의 데이터 삽입Using the SELECT and EXECUTE options to insert data from other tables

다음 예에서는 INSERT...SELECT 또는 INSERT...EXECUTE를 사용하여 한 테이블의 데이터를 다른 테이블에 삽입하는 방법을 보여 줍니다.The following example shows how to insert data from one table into another table by using INSERT...SELECT or INSERT...EXECUTE. 이 방법은 모두 열 목록에 리터럴 값과 식을 포함하는 다중 테이블 SELECT 문을 기반으로 합니다.Each is based on a multi-table SELECT statement that includes an expression and a literal value in the column list.

첫 번째 INSERT 문은 SELECT 문을 사용하여 AdventureWorks2012AdventureWorks2012 데이터베이스의 원본 테이블(Employee, SalesPersonPerson)에서 데이터를 파생시키고 결과 집합을 EmployeeSales 테이블에 저장합니다.The first INSERT statement uses a SELECT statement to derive the data from the source tables (Employee, SalesPerson, and Person) in the AdventureWorks2012AdventureWorks2012 database and store the result set in the EmployeeSales table. 두 번째 INSERT 문은 EXECUTE 절을 사용하여 SELECT 문을 포함하는 저장 프로시저를 호출하고 세 번째 INSERT 문은 EXECUTE 절을 사용하여 SELECT 문을 리터럴 문자열로 참조합니다.The second INSERT statement uses the EXECUTE clause to call a stored procedure that contains the SELECT statement, and the third INSERT uses the EXECUTE clause to reference the SELECT statement as a literal string.

CREATE TABLE dbo.EmployeeSales  
( DataSource   varchar(20) NOT NULL,  
  BusinessEntityID   varchar(11) NOT NULL,  
  LastName     varchar(40) NOT NULL,  
  SalesDollars money NOT NULL  
);  
GO  
CREATE PROCEDURE dbo.uspGetEmployeeSales   
AS   
    SET NOCOUNT ON;  
    SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName,   
        sp.SalesYTD   
    FROM Sales.SalesPerson AS sp    
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE '2%'  
    ORDER BY sp.BusinessEntityID, c.LastName;  
GO  
--INSERT...SELECT example  
INSERT INTO dbo.EmployeeSales  
    SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE '2%'  
    ORDER BY sp.BusinessEntityID, c.LastName;  
GO  
--INSERT...EXECUTE procedure example  
INSERT INTO dbo.EmployeeSales   
EXECUTE dbo.uspGetEmployeeSales;  
GO  
--INSERT...EXECUTE('string') example  
INSERT INTO dbo.EmployeeSales   
EXECUTE   
('  
SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName,   
    sp.SalesYTD   
    FROM Sales.SalesPerson AS sp   
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE ''2%''  
    ORDER BY sp.BusinessEntityID, c.LastName  
');  
GO  
--Show results.  
SELECT DataSource,BusinessEntityID,LastName,SalesDollars  
FROM dbo.EmployeeSales;  

9.I. WITH 공통 테이블 식을 사용하여 삽입할 데이터 정의Using WITH common table expression to define the data inserted

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스에 NewEmployee 테이블을 만듭니다.The following example creates the NewEmployee table in the AdventureWorks2012AdventureWorks2012 database. 공통 테이블 식(EmployeeTemp)은 하나 이상의 테이블에서 NewEmployee 테이블에 삽입할 행을 정의합니다.A common table expression (EmployeeTemp) defines the rows from one or more tables to be inserted into the NewEmployee table. INSERT 문은 공통 테이블 식의 열을 참조합니다.The INSERT statement references the columns in the common table expression.

CREATE TABLE HumanResources.NewEmployee  
(  
    EmployeeID int NOT NULL,  
    LastName nvarchar(50) NOT NULL,  
    FirstName nvarchar(50) NOT NULL,  
    PhoneNumber Phone NULL,  
    AddressLine1 nvarchar(60) NOT NULL,  
    City nvarchar(30) NOT NULL,  
    State nchar(3) NOT NULL,   
    PostalCode nvarchar(15) NOT NULL,  
    CurrentFlag Flag  
);  
GO  
WITH EmployeeTemp (EmpID, LastName, FirstName, Phone,   
                   Address, City, StateProvince,   
                   PostalCode, CurrentFlag)  
AS (SELECT   
       e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,  
       a.AddressLine1, a.City, sp.StateProvinceCode,   
       a.PostalCode, e.CurrentFlag  
    FROM HumanResources.Employee e  
        INNER JOIN Person.BusinessEntityAddress AS bea  
        ON e.BusinessEntityID = bea.BusinessEntityID  
        INNER JOIN Person.Address AS a  
        ON bea.AddressID = a.AddressID  
        INNER JOIN Person.PersonPhone AS pp  
        ON e.BusinessEntityID = pp.BusinessEntityID  
        INNER JOIN Person.StateProvince AS sp  
        ON a.StateProvinceID = sp.StateProvinceID  
        INNER JOIN Person.Person as c  
        ON e.BusinessEntityID = c.BusinessEntityID  
    )  
INSERT INTO HumanResources.NewEmployee   
    SELECT EmpID, LastName, FirstName, Phone,   
           Address, City, StateProvince, PostalCode, CurrentFlag  
    FROM EmployeeTemp;  
GO  

J.J. TOP을 사용하여 원본 테이블에서 삽입되는 데이터 제한Using TOP to limit the data inserted from the source table

다음 예에서는 EmployeeSales 테이블을 만들고 AdventureWorks2012AdventureWorks2012 데이터베이스의 HumanResources.Employee 테이블에서 가져온 임의의 직원 상위 5명에 대한 이름 및 연간 매출 데이터를 삽입합니다.The following example creates the table EmployeeSales and inserts the name and year-to-date sales data for the top 5 random employees from the table HumanResources.Employee in the AdventureWorks2012AdventureWorks2012 database. INSERT 문은 SELECT 문에서 반환되는 행 중 5개를 선택합니다.The INSERT statement chooses any 5 rows returned by the SELECT statement. OUTPUT 절은 EmployeeSales 테이블에 삽입되는 행을 표시합니다.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. SELECT 문의 ORDER BY 절은 상위 5명의 직원을 결정하는 데 사용되지 않습니다.Notice that the ORDER BY clause in the SELECT statement is not used to determine the top 5 employees.

CREATE TABLE dbo.EmployeeSales  
( EmployeeID   nvarchar(11) NOT NULL,  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  YearlySales  money NOT NULL  
 );  
GO  
INSERT TOP(5)INTO dbo.EmployeeSales  
    OUTPUT inserted.EmployeeID, inserted.FirstName, 
        inserted.LastName, inserted.YearlySales  
    SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.SalesYTD > 250000.00  
    ORDER BY sp.SalesYTD DESC;  

TOP을 사용하여 시간 순서로 행을 삽입해야 할 경우 다음 예와 같이 하위 SELECT 문에서 ORDER BY 절과 함께 TOP을 사용해야 합니다.If you have to use TOP to insert rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement as shown in the following example. OUTPUT 절은 EmployeeSales 테이블에 삽입되는 행을 표시합니다.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. 이제 임의의 행이 아니라 ORDER BY 절의 결과에 따라 상위 5명의 직원이 삽입됩니다.Notice that the top 5 employees are now inserted based on the results of the ORDER BY clause instead of random rows.

INSERT INTO dbo.EmployeeSales  
    OUTPUT inserted.EmployeeID, inserted.FirstName, 
        inserted.LastName, inserted.YearlySales  
    SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.SalesYTD > 250000.00  
    ORDER BY sp.SalesYTD DESC;  

표준 테이블 이외의 대상 개체 지정Specifying Target Objects Other Than Standard Tables

이 섹션의 예에서는 뷰 또는 테이블 변수를 지정하여 행을 삽입하는 방법을 보여 줍니다.Examples in this section demonstrate how to insert rows by specifying a view or table variable.

11.K. 뷰를 지정하여 데이터 삽입Inserting data by specifying a view

다음 예에서는 뷰 이름을 대상 개체로 지정하지만 새 행이 기본 테이블에 삽입됩니다.The following example specifies a view name as the target object; however, the new row is inserted in the underlying base table. INSERT 문의 값 순서는 뷰의 열 순서와 일치해야 합니다.The order of the values in the INSERT statement must match the column order of the view. 자세한 내용은 뷰를 통해 데이터 수정을 참조하세요.For more information, see Modify Data Through a View.

CREATE TABLE T1 ( column_1 int, column_2 varchar(30));  
GO  
CREATE VIEW V1 AS   
SELECT column_2, column_1   
FROM T1;  
GO  
INSERT INTO V1   
    VALUES ('Row 1',1);  
GO  
SELECT column_1, column_2   
FROM T1;  
GO  
SELECT column_1, column_2  
FROM V1;  
GO  

12.L. 테이블 변수에 데이터 삽입Inserting data into a table variable

다음 예는 테이블 변수를 AdventureWorks2012AdventureWorks2012 데이터베이스의 대상 개체로 지정합니다.The following example specifies a table variable as the target object in the AdventureWorks2012AdventureWorks2012 database.

-- Create the table variable.  
DECLARE @MyTableVar table(  
    LocationID int NOT NULL,  
    CostRate smallmoney NOT NULL,  
    NewCostRate AS CostRate * 1.5,  
    ModifiedDate datetime);  
  
-- Insert values into the table variable.  
INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)  
    SELECT LocationID, CostRate, GETDATE() 
    FROM Production.Location  
    WHERE CostRate > 0;  
  
-- View the table variable result set.  
SELECT * FROM @MyTableVar;  
GO  

원격 테이블에 행 삽입Inserting Rows into a Remote Table

이 섹션의 예에서는 연결된 서버 또는 행 집합 함수를 사용하여 원격 테이블을 참조하여 원격 대상 테이블에 행을 삽입하는 방법을 보여줍니다.Examples in this section demonstrate how to insert rows into a remote target table by using a linked server or a rowset function to reference the remote table.

13.M. 연결된 서버를 사용하여 원격 테이블에 데이터 삽입Inserting data into a remote table by using a linked server

다음 예에서는 원격 테이블에 행을 삽입합니다.The following example inserts rows into a remote table. 먼저 sp_addlinkedserver를 사용하여 원격 데이터 원본에 대한 링크를 만듭니다.The example begins by creating a link to the remote data source by using sp_addlinkedserver. 그런 다음, 연결된 서버 이름 MyLinkServerserver.catalog.schema.object와 같이 네 부분으로 구성된 개체 이름의 일부로 지정됩니다.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' 
-- or 'server_nameinstance_name'.  
  
EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
GO  
-- Specify the remote data source in the FROM clause using a four-part name   
-- in the form linked_server.catalog.schema.object.  
  
INSERT INTO MyLinkServer.AdventureWorks2012.HumanResources.Department (Name, GroupName)  
VALUES (N'Public Relations', N'Executive General and Administration');  
GO  

14.N. OPENQUERY 함수를 사용하여 원격 테이블에 데이터 삽입Inserting data into a remote table by using the OPENQUERY function

다음 예에서는 OPENQUERY 행 집합 함수를 지정하여 원격 테이블에 행을 삽입합니다.The following example inserts a row into a remote table by specifying the OPENQUERY rowset function. 이 예에서는 이전 예에서 만든 연결된 서버 이름이 사용됩니다.The linked server name created in the previous example is used in this example.

적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

INSERT OPENQUERY (MyLinkServer, 
    'SELECT Name, GroupName 
     FROM AdventureWorks2012.HumanResources.Department')  
VALUES ('Environmental Impact', 'Engineering');  
GO  

15.O. OPENDATASOURCE 함수를 사용하여 원격 테이블에 데이터 삽입Inserting data into a remote table by using the OPENDATASOURCE function

다음 예에서는 OPENDATASOURCE 행 집합 함수를 지정하여 원격 테이블에 행을 삽입합니다.The following example inserts a row into a remote table by specifying the OPENDATASOURCE rowset function. server_name 또는 server_name\instance_name 형식을 사용하여 데이터 원본에 대해 유효한 서버 이름을 지정해야 합니다.Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

-- Use the OPENDATASOURCE function to specify the remote data source.  
-- Specify a valid server name for Data Source using the format 
-- server_name or server_nameinstance_name.  
  
INSERT INTO OPENDATASOURCE('SQLNCLI',  
    'Data Source= <server_name>; Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department (Name, GroupName)  
    VALUES (N'Standards and Methods', 'Quality Assurance');  
GO  

16.P. PolyBase를 사용하여 만든 외부 테이블에 삽입Inserting into an external table created using PolyBase

SQL Server에서 Hadoop 또는 Azure 스토리지로 데이터를 내보냅니다.Export data from SQL Server to Hadoop or Azure Storage. 먼저 대상 파일이나 디렉터리를 가리키는 외부 테이블을 만듭니다.First, create an external table that points to the destination file or directory. 그런 다음 INSERT INTO를 사용하여 로컬 SQL Server 테이블에서 외부 데이터 원본으로 데이터를 내보냅니다.Then, use INSERT INTO to export data from a local SQL Server table to an external data source. INSERT INTO 문은 대상 파일이나 디렉터리가 없으면 만듭니다. SELECT 문의 결과는 지정된 파일 형식으로 생성되어 지정한 위치로 내보내집니다.The INSERT INTO statement creates the destination file or directory if it does not exist and the results of the SELECT statement are exported to the specified location in the specified file format. 자세한 내용은 PolyBase 시작을 참조하세요.For more information, see Get started with PolyBase.

적용 대상: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

-- Create an external table.   
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009] (  
        [FirstName] char(25) NOT NULL,   
        [LastName] char(25) NOT NULL,   
        [YearlyIncome] float NULL,   
        [MaritalStatus] char(1) NOT NULL  
)  
WITH (  
        LOCATION='/old_data/2009/customerdata.tbl',  
        DATA_SOURCE = HadoopHDP2,  
        FILE_FORMAT = TextFileFormat,  
        REJECT_TYPE = VALUE,  
        REJECT_VALUE = 0  
);  
  
-- Export data: Move old data to Hadoop while keeping 
-- it query-able via external table.  

INSERT INTO dbo.FastCustomer2009  
SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2  
ON (T1.CustomerKey = T2.CustomerKey)  
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;  

테이블 또는 데이터 파일에서 데이터 대량 로드Bulk Loading Data from Tables or Data Files

이 섹션의 예에서는 INSERT 문을 사용하여 데이터를 테이블에 대량으로 로드하는 두 가지 방법을 보여 줍니다.Examples in this section demonstrate two methods to bulk load data into a table by using the INSERT statement.

17.Q. 최소 로깅으로 힙에 데이터 삽입Inserting data into a heap with minimal logging

다음 예에서는 새 테이블(힙)을 만들고 최소 로깅을 사용하여 다른 테이블의 데이터를 새 테이블에 삽입합니다.The following example creates a new table (a heap) and inserts data from another table into it using minimal logging. 여기에서는 AdventureWorks2012 데이터베이스의 복구 모델이 FULL로 설정되었다고 가정합니다.The example assumes that the recovery model of the AdventureWorks2012 database is set to FULL. 최소 로깅이 사용되도록 하려면 행 삽입 전에 AdventureWorks2012 데이터베이스의 복구 모델을 BULK_LOGGED로 설정하고 INSERT INTO...SELECT 문 뒤에 FULL로 다시 설정합니다.To ensure minimal logging is used, the recovery model of the AdventureWorks2012 database is set to BULK_LOGGED before rows are inserted and reset to FULL after the INSERT INTO...SELECT statement. 또한 대상 테이블 Sales.SalesHistory에 대해 TABLOCK 힌트가 지정됩니다.In addition, the TABLOCK hint is specified for the target table Sales.SalesHistory. 이렇게 하면 문은 트랜잭션 로그에 최소 공간을 사용하여 효율적으로 수행됩니다.This ensures that the statement uses minimal space in the transaction log and performs efficiently.

-- Create the target heap.  
CREATE TABLE Sales.SalesHistory(  
    SalesOrderID int NOT NULL,  
    SalesOrderDetailID int NOT NULL,  
    CarrierTrackingNumber nvarchar(25) NULL,  
    OrderQty smallint NOT NULL,  
    ProductID int NOT NULL,  
    SpecialOfferID int NOT NULL,  
    UnitPrice money NOT NULL,  
    UnitPriceDiscount money NOT NULL,  
    LineTotal money NOT NULL,  
    rowguid uniqueidentifier ROWGUIDCOL  NOT NULL,  
    ModifiedDate datetime NOT NULL );  
GO  
-- Temporarily set the recovery model to BULK_LOGGED.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY BULK_LOGGED;  
GO  
-- Transfer data from Sales.SalesOrderDetail to Sales.SalesHistory  
INSERT INTO Sales.SalesHistory WITH (TABLOCK)  
    (SalesOrderID,   
     SalesOrderDetailID,  
     CarrierTrackingNumber,   
     OrderQty,   
     ProductID,   
     SpecialOfferID,   
     UnitPrice,   
     UnitPriceDiscount,  
     LineTotal,   
     rowguid,   
     ModifiedDate)  
SELECT * FROM Sales.SalesOrderDetail;  
GO  
-- Reset the recovery model.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY FULL;  
GO  

18.R. OPENROWSET 함수를 BULK와 함께 사용하여 테이블에 데이터 대량 로드Using the OPENROWSET function with BULK to bulk load data into a table

다음 예에서는 OPENROWSET 함수를 지정하여 데이터 파일의 행을 테이블에 삽입합니다.The following example inserts rows from a data file into a table by specifying the OPENROWSET function. 성능 최적화를 위해 IGNORE_TRIGGERS 테이블 힌트가 지정됩니다.The IGNORE_TRIGGERS table hint is specified for performance optimization. 더 많은 예제를 보려면 BULK INSERT 또는 OPENROWSET(BULK...)를 사용하여 데이터 대량 가져오기(SQL Server)를 참조하세요.For more examples, see Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

적용 대상: SQL Server 2008SQL Server 2008 부터 SQL Server 2017SQL Server 2017까지Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)  
SELECT b.Name, b.GroupName   
FROM OPENROWSET (  
    BULK 'C:SQLFilesDepartmentData.txt',  
    FORMATFILE = 'C:SQLFilesBulkloadFormatFile.xml',  
    ROWS_PER_BATCH = 15000)AS b ;  

힌트를 사용하여 쿼리 최적화 프로그램의 기본 동작 재정의Overriding the Default Behavior of the Query Optimizer by Using Hints

이 섹션의 예에서는 INSERT 문을 처리할 때 쿼리 최적화 프로그램의 기본 동작을 임시로 재정의하기 위해 테이블 힌트를 사용하는 방법을 보여 줍니다.Examples in this section demonstrate how to use table hints to temporarily override the default behavior of the query optimizer when processing the INSERT statement.

주의

일반적으로 SQL ServerSQL Server 쿼리 최적화 프로그램은 쿼리에 대해 최상의 실행 계획을 선택하므로 숙련된 개발자 및 데이터베이스 관리자가 마지막 방법으로만 힌트를 사용하는 것이 좋습니다.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

S.는S. TABLOCK 힌트를 사용하여 잠금 방법 지정Using the TABLOCK hint to specify a locking method

다음 예에서는 Production.Location 테이블에 배타적(X) 잠금을 적용하고 INSERT 문이 끝날 때까지 유지하도록 지정합니다.The following example specifies that an exclusive (X) lock is taken on the Production.Location table and is held until the end of the INSERT statement.

적용 대상: SQL ServerSQL Server, SQL DatabaseSQL DatabaseApplies to: SQL ServerSQL Server, SQL DatabaseSQL Database.

INSERT INTO Production.Location WITH (XLOCK)  
(Name, CostRate, Availability)  
VALUES ( N'Final Inventory', 15.00, 80.00);  

INSERT 문의 결과 캡처Capturing the Results of the INSERT Statement

이 섹션의 예에서는 OUTPUT 절을 사용하여 INSERT 문의 영향을 받는 각 행의 정보 또는 각 행을 기반으로 하는 식을 반환하는 방법을 보여 줍니다.Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an INSERT statement. 이러한 결과를 처리 응용 프로그램에 반환하여 확인 메시지, 보관 및 기타 응용 프로그램 요구 사항을 충족시키는 데 사용할 수 있습니다.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

20.T. INSERT 문에 OUTPUT 사용Using OUTPUT with an INSERT statement

다음 예에서는 ScrapReason 테이블에 행을 삽입하고 OUTPUT 절을 사용하여 문의 결과를 @MyTableVar 테이블 변수에 반환합니다.The following example inserts a row into the ScrapReason table and uses the OUTPUT clause to return the results of the statement to the @MyTableVar table variable. ScrapReasonID 열은 IDENTITY 속성으로 정의되었으므로 해당 열에 대한 INSERT 문에 값이 지정되지 않습니다.Because the ScrapReasonID column is defined with an IDENTITY property, a value is not specified in the INSERT statement for that column. 그러나 해당 열에 대해 데이터베이스 엔진Database Engine에서 생성한 값은 OUTPUT 열의 INSERTED.ScrapReasonID 절에서 반환됩니다.However, note that the value generated by the 데이터베이스 엔진Database Engine for that column is returned in the OUTPUT clause in the INSERTED.ScrapReasonID column.

DECLARE @MyTableVar table( NewScrapReasonID smallint,  
                           Name varchar(50),  
                           ModifiedDate datetime);  
INSERT Production.ScrapReason  
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate  
        INTO @MyTableVar  
VALUES (N'Operator error', GETDATE());  
  
--Display the result set of the table variable.  
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;  
--Display the result set of the table.  
SELECT ScrapReasonID, Name, ModifiedDate   
FROM Production.ScrapReason;  

21.U. ID 열 및 계산 열에 OUTPUT 사용Using OUTPUT with identity and computed columns

다음 예에서는 EmployeeSales 테이블을 만들고 INSERT 문에 SELECT 문을 사용하여 이 테이블에 여러 개의 행을 삽입한 후 원본 테이블에서 데이터를 검색합니다.The following example creates the EmployeeSales table and then inserts several rows into it using an INSERT statement with a SELECT statement to retrieve data from source tables. EmployeeSales 테이블에는 ID 열(EmployeeID)과 계산 열(ProjectedSales)이 포함되어 있습니다.The EmployeeSales table contains an identity column (EmployeeID) and a computed column (ProjectedSales). 이러한 값은 삽입 작업 중에 데이터베이스 엔진Database Engine에서 생성되므로 @MyTableVar에 이러한 열을 정의할 수 없습니다.Because these values are generated by the 데이터베이스 엔진Database Engine during the insert operation, neither of these columns can be defined in @MyTableVar.

CREATE TABLE dbo.EmployeeSales  
( EmployeeID   int IDENTITY (1,5)NOT NULL,  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  CurrentSales money NOT NULL,  
  ProjectedSales AS CurrentSales * 1.10   
);  
GO  
DECLARE @MyTableVar table(  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  CurrentSales money NOT NULL  
  );  
  
INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)  
  OUTPUT INSERTED.LastName,   
         INSERTED.FirstName,   
         INSERTED.CurrentSales  
  INTO @MyTableVar  
    SELECT c.LastName, c.FirstName, sp.SalesYTD  
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE '2%'  
    ORDER BY c.LastName, c.FirstName;  
  
SELECT LastName, FirstName, CurrentSales  
FROM @MyTableVar;  
GO  
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales  
FROM dbo.EmployeeSales;  

22.V. OUTPUT 절에서 반환된 데이터 삽입Inserting data returned from an OUTPUT clause

다음 예에서는 MERGE 문의 OUTPUT 절에서 반환된 데이터를 캡처하여 이 데이터를 다른 테이블에 삽입합니다.The following example captures data returned from the OUTPUT clause of a MERGE statement, and inserts that data into another table. MERGE 문은 Quantity 테이블의 ProductInventory 열을 AdventureWorks2012AdventureWorks2012 데이터베이스에 있는 SalesOrderDetail 테이블에서 처리되는 순서대로 매일 업데이트하고The MERGE statement updates the Quantity column of the ProductInventory table daily, based on orders that are processed in the SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database. 또한 재고가 0이 되는 제품의 행을 삭제합니다.It also deletes rows for products whose inventories drop to 0. 이 예에서는 삭제된 행을 캡처한 후 다른 ZeroInventory 테이블에 삽입하여 재고가 없는 제품을 추적합니다.The example captures the rows that are deleted and inserts them into another table, ZeroInventory, which tracks products with no inventory.

--Create ZeroInventory table.  
CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime);  
GO  
  
INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate)  
SELECT ProductID, GETDATE()  
FROM  
(   MERGE Production.ProductInventory AS pi  
    USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod  
           JOIN Sales.SalesOrderHeader AS soh  
           ON sod.SalesOrderID = soh.SalesOrderID  
           AND soh.OrderDate = '20070401'  
           GROUP BY ProductID) AS src (ProductID, OrderQty)  
    ON (pi.ProductID = src.ProductID)  
    WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0  
        THEN DELETE  
    WHEN MATCHED  
        THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty  
    OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)  
WHERE Action = 'DELETE';  
IF @@ROWCOUNT = 0  
PRINT 'Warning: No rows were inserted';  
GO  
SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;  

W.W. SELECT 옵션을 사용하여 데이터 삽입Inserting data using the SELECT option

다음 예에서는 SELECT 옵션으로 INSERT 문을 사용하여 여러 행의 데이터를 삽입하는 방법을 보여줍니다.The following example shows how to insert multiple rows of data using an INSERT statement with a SELECT option. 첫 번째 INSERT 문은 SELECT 문을 직접 사용하여 원본 테이블에서 데이터를 검색한 다음, 결과 집합을 EmployeeTitles 테이블에 저장합니다.The first INSERT statement uses a SELECT statement directly to retrieve data from the source table, and then to store the result set in the EmployeeTitles table.

CREATE TABLE EmployeeTitles  
( EmployeeKey   INT NOT NULL,  
  LastName     varchar(40) NOT NULL,  
  Title      varchar(50) NOT NULL  
);  
INSERT INTO EmployeeTitles  
    SELECT EmployeeKey, LastName, Title   
    FROM ssawPDW.dbo.DimEmployee  
    WHERE EndDate IS NULL;  

X.X. INSERT 문으로 레이블 지정Specifying a label with the INSERT statement

다음 예에서는 INSERT 문에 레이블을 사용하는 방법을 보여줍니다.The following example shows the use of a label with an INSERT statement.

-- Uses AdventureWorks  
  
INSERT INTO DimCurrency   
VALUES (500, N'C1', N'Currency1')  
OPTION ( LABEL = N'label1' );  

Y.Y. INSERT 문에 레이블 및 쿼리 힌트 사용Using a label and a query hint with the INSERT statement

이 쿼리는 INSERT 문에 레이블 및 쿼리 조인 힌트를 사용하는 기본 구문을 보여줍니다.This query shows the basic syntax for using a label and a query join hint with the INSERT statement. 쿼리가 제어 노드에 제출된 후 계산 노드에서 실행되는 SQL ServerSQL ServerSQL ServerSQL Server 쿼리 계획을 생성할 때 해시 조인 전략을 적용합니다.After the query is submitted to the Control node, SQL ServerSQL Server, running on the Compute nodes, will apply the hash join strategy when it generates the SQL ServerSQL Server query plan. 조인 힌트 및 OPTION 절을 사용하는 방법에 대한 자세한 내용은 OPTION(SQL Server PDW) 을 참조하십시오.For more information on join hints and how to use the OPTION clause, see OPTION (SQL Server PDW).

-- Uses AdventureWorks  
  
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey, 
    FirstName, MiddleName, LastName )   
SELECT ProspectiveBuyerKey, ProspectAlternateKey, 
    FirstName, MiddleName, LastName  
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode  
WHERE g.CountryRegionCode = 'FR'  
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);  

참고 항목See Also

BULK INSERT(Transact-SQL) BULK INSERT (Transact-SQL)
DELETE(Transact-SQL) DELETE (Transact-SQL)
EXECUTE(Transact-SQL) EXECUTE (Transact-SQL)
FROM(Transact-SQL) FROM (Transact-SQL)
IDENTITY(속성)(Transact-SQL) IDENTITY (Property) (Transact-SQL)
NEWID(Transact-SQL) NEWID (Transact-SQL)
SELECT(Transact-SQL) SELECT (Transact-SQL)
UPDATE(Transact-SQL) UPDATE (Transact-SQL)
MERGE(Transact-SQL) MERGE (Transact-SQL)
OUTPUT Clause (Transact-SQL) OUTPUT Clause (Transact-SQL)
inserted 및 deleted 테이블 사용Use the inserted and deleted Tables