INSERT(Transact-SQL)

테이블이나 뷰에 새 행을 추가합니다.

항목 링크 아이콘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 ] ) 
    | derived_table 
    | execute_statement 
    } 
} 
    | DEFAULT VALUES 
[; ]

<object> ::=
{ 
    [ server_name . database_name . schema_name . 
      | database_name .[ schema_name ] . 
      | schema_name . 
    ]
        table_or_view_name
}

인수

  • WITH <common_table_expression>
    INSERT 문의 범위 내에 정의된 임시로 명명된 결과 집합(공통 테이블 식이라고도 함)을 지정합니다. 결과 집합은 SELECT 문에서 파생됩니다.

    공통 테이블 식은 SELECT, DELETE, UPDATE 및 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
    테이블 또는 뷰가 있는 서버의 이름(OPENDATASOURCE 함수를 서버 이름으로 사용)입니다. server_name을 지정하는 경우에는 database_nameschema_name을 지정해야 합니다.
  • database_name
    데이터베이스의 이름입니다.
  • schema_name
    테이블이나 뷰가 속한 스키마의 이름입니다.
  • table_or view_name
    데이터를 받는 테이블 또는 뷰의 이름입니다.

    table 변수를 해당 범위 내에서 INSERT 문의 테이블 원본으로 사용할 수 있습니다.

    table_or_view_name에서 참조되는 뷰는 업데이트가 가능해야 하며 해당 뷰의 FROM 절에서 하나의 기본 테이블을 참조해야 합니다. 예를 들어 여러 뷰에 대해 INSERT 작업을 하려면 반드시 하나의 기본 테이블 열만 참조하는 column_list를 사용해야 합니다. 업데이트할 수 있는 뷰에 대한 자세한 내용은 CREATE VIEW(Transact-SQL)를 참조하십시오.

  • WITH ( <table_hint_limited> [... n ] )
    대상 테이블에 허용되는 하나 이상의 테이블 힌트를 지정합니다. WITH 키워드와 괄호가 필요합니다.

    READPAST, NOLOCK 및 READUNCOMMITTED는 허용되지 않습니다. 테이블 힌트에 대한 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하십시오.

    ms174335.note(ko-kr,SQL.90).gif중요:
    INSERT 문의 대상 테이블에 HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD 또는 UPDLOCK 힌트를 지정하는 기능은 이후 버전의 SQL Server에서 제거될 예정입니다. 이러한 힌트는 INSERT 문의 성능에 영향을 주지 않습니다. 향후 개발 작업에서는 이러한 힌트를 사용하지 않도록 하고 현재 이 힌트를 사용하는 응용 프로그램은 수정하십시오.

    INSERT 문의 대상 테이블에 TABLOCK 힌트를 지정하는 것은 TABLOCKX 힌트를 지정하는 것과 동일한 결과를 얻을 수 있습니다. 테이블을 배타적으로 잠급니다.

  • (column_list)
    데이터를 삽입할 하나 이상의 열 목록입니다. column_list는 반드시 괄호로 묶어야 하며 쉼표로 구분해야 합니다.

    열이 column_list에 없는 경우 SQL Server 2005 데이터베이스 엔진에서는 이 열 정의를 기준으로 하여 값을 제공할 수 있어야 합니다. 그렇지 않은 경우에는 행을 로드할 수 없습니다. 열이 다음과 같은 경우에는 데이터베이스 엔진이 열에 대한 값을 자동으로 제공합니다.

    • 열에 IDENTITY 속성이 있는 경우. 다음 증분 ID 값을 사용합니다.
    • 열에 기본값이 있는 경우. 열의 기본값을 사용합니다.
    • timestamp 데이터 형식 열인 경우. 현재 타임스탬프 값을 사용합니다.
    • Null을 허용하는 열인 경우. Null 값을 사용합니다.
    • 계산 열인 경우. 계산된 값을 사용합니다.

    명시적인 값을 ID 열에 삽입할 경우 반드시 column_list와 VALUES 목록을 사용해야 하며 테이블에 대해 SET IDENTITY_INSERT 옵션을 ON으로 설정해야 합니다.

  • OUTPUT 절
    삽입 작업으로 삽입된 행을 반환합니다. 로컬 분할 뷰, 분산형 분할 뷰, 원격 테이블 또는 execute_statement를 포함한 INSERT 문을 참조하는 DML 문에서는 OUTPUT 절이 지원되지 않습니다.
  • VALUES
    삽입할 데이터 값의 목록을 표시합니다. column_list(지정된 경우) 또는 테이블의 각 열에 대해 반드시 하나의 데이터 값이 있어야 합니다. 값 목록은 괄호로 묶어야 합니다.

    VALUES 목록에 있는 값과 테이블에 있는 열의 순서가 다르거나 테이블의 각각의 열에 대해 해당되는 값이 없는 경우에는 각각의 받는 값을 저장하는 열을 명시적으로 지정하기 위해 반드시 column_list를 사용해야 합니다.

  • DEFAULT
    데이터베이스 엔진이 열에 대해 정의된 기본값을 로드하도록 설정합니다. 열에 대한 기본값이 없고 열에 NULL 값을 사용할 수 있는 경우에는 NULL이 삽입됩니다. timestamp 데이터 형식으로 정의된 열의 경우 다음 타임스탬프 값이 삽입됩니다. ID 열에는 DEFAULT를 사용할 수 없습니다.
  • expression
    상수, 변수 또는 식입니다. 식은 SELECT 또는 EXECUTE 문을 포함할 수 없습니다.
  • derived_table
    테이블에 로드될 데이터의 행을 반환하는 유효한 SELECT 문입니다. SELECT 문은 CTE(공통 테이블 식)를 포함할 수 없습니다.
  • execute_statement
    SELECT 또는 READTEXT 문을 사용하여 데이터를 반환하는 유효한 EXECUTE 문입니다. SELECT 문은 CTE를 포함할 수 없습니다.

    execute_statement 를 INSERT에 사용하는 경우 각 결과 집합은 테이블 또는 column_list 내의 열과 호환되어야 합니다.

    execute_statement는 같은 컴퓨터 또는 원격 컴퓨터에서 저장 프로시저를 실행하는 데 사용할 수 있습니다. 원격 서버에서 프로시저가 실행된 후 결과 집합이 로컬 서버로 반환되어 로컬 서버의 테이블로 로드됩니다.

    SQL Server 2008에서는 연결된 루프백 서버에 대해 실행되는 INSERT...EXECUTE 문의 트랜잭션 의미 체계가 변경되었습니다. SQL Server 2005에서는 이 시나리오가 지원되지 않으며 오류가 발생합니다. SQL Server 2008의 경우 연결에 MARS(Multiple Active Result Sets)가 활성화되어 있지 않으면 연결된 루프백 서버에 대해 INSERT...EXECUTE 문을 실행할 수 있습니다. 연결에 MARS가 활성화되어 있으면 SQL Server 2005에서와 같은 동작이 수행됩니다.

    execute_statement가 READTEXT 문을 사용하여 데이터를 반환하는 경우 각 READTEXT 문은 최대 1MB(1024KB)의 데이터를 반환할 수 있습니다. execute_statement는 확장 프로시저에서도 사용할 수 있습니다. execute_statement는 확장 프로시저의 주 스레드에서 반환한 데이터는 삽입하지만 주 스레드를 제외한 스레드에서 나온 결과는 삽입하지 않습니다.

  • DEFAULT VALUES
    새 행이 각 열에 대해 정의된 기본값을 포함하도록 설정합니다.

주의

INSERT는 테이블에 새 행을 추가합니다. 테이블의 데이터를 교체하려면 DELETE 또는 TRUNCATE TABLE 문을 사용하여 기존 데이터를 지운 다음 INSERT를 사용하여 새 데이터를 로드해야 합니다. 기존 행의 열 값을 수정하려면 UPDATE를 사용합니다. SELECT 문의 INTO 옵션을 사용하면 새 테이블 생성과 데이터 로드를 한꺼번에 수행할 수 있습니다.

uniqueidentifier 데이터 형식으로 만든 열은 특수한 형식의 16바이트 이진 값을 저장합니다. ID 열의 경우와 달리 uniqueidentifier 데이터 형식의 열에 대해서는 데이터베이스 엔진이 자동으로 값을 생성하지 않습니다. 삽입 작업 중에는 uniqueidentifier 열에 uniqueidentifier 데이터 형식의 변수 및 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(하이픈을 포함하여 36자, x는 0-9 또는 a-f 범위의 16진수 값) 형식의 문자열 상수를 사용할 수 있습니다. 예를 들어 6F9619FF-8B86-D011-B42D-00C04FC964FF는 uniqueidentifier 변수 또는 열에 대해 유효한 값입니다. NEWID() 함수를 사용하여 GUID(Globally Unique Identifier)를 구합니다.

SET ROWCOUNT 옵션 설정은 로컬 및 원격 분할 뷰에 대한 INSERT 문에서는 무시됩니다. 또한 이 옵션은 호환성 수준이 80 이상으로 설정되어 있는 경우 데이터베이스 엔진에서 원격 테이블에 대해 실행된 INSERT 문에서는 지원되지 않습니다.

식 평가 중 INSERT 문에서 산술 오류(오버플로, 0으로 나누기, 도메인 오류 등)가 발생하면 데이터베이스 엔진은 SET ARITHABORT가 ON으로 설정된 것으로 가정하고 이러한 오류를 처리합니다. 나머지 일괄 처리가 중지되고 오류 메시지가 반환됩니다.

행 삽입 규칙

행을 삽입할 때는 다음과 같은 규칙이 적용됩니다.

  • char, varchar 또는 varbinary 데이터 형식의 열에 값이 로드되는 경우 후행 공백(charvarchar의 경우 공백, varbinary의 경우 0)의 채우기 또는 잘라내기는 테이블이 생성될 때 열에 대해 정의된 SET ANSI_PADDING 설정에 의해 결정됩니다. 자세한 내용은 SET ANSI_PADDING(Transact-SQL)을 참조하십시오.
    다음 표에서는 SET ANSI_PADDING이 OFF일 때의 기본 작업을 보여 줍니다.

    데이터 형식 기본 작업

    char

    정의된 열 너비만큼 공백으로 값을 채웁니다.

    varchar

    공백이 아닌 마지막 문자 또는 단일 공백 문자(공백으로만 이루어진 문자열의 경우)에 대한 후행 공백을 제거합니다.

    varbinary

    후행 0을 제거합니다.

  • 빈 문자열(' ')이 varchar 또는 text 데이터 형식의 열에 로드된 경우 기본 작업은 길이가 0인 문자열을 로드하는 것입니다.

  • INSERT 문이 제약 조건 또는 규칙을 위반하거나 열의 데이터 형식과 호환되지 않는 값을 가진 경우에는 문이 실패하고 데이터베이스 엔진이 오류 메시지를 표시합니다.

  • text 또는 image 열에 Null 값을 삽입하면 유효한 텍스트 포인터가 생성되지 않고 8KB 텍스트 페이지도 사전 할당되지 않습니다. textimage 데이터 삽입에 대한 자세한 내용은 text, ntext 및 image 함수 사용을 참조하십시오.

  • INSERT가 SELECT 또는 EXECUTE를 사용하여 여러 행을 로드하는 경우 로드되는 값 중에서 규칙 또는 제약 조건 위반이 발생하면 전체 문이 중지되며 어떤 행도 로드되지 않습니다.

  • 데이터베이스 엔진 원격 인스턴스의 테이블에 값을 삽입할 때 모든 열에 대한 값이 모두 지정되어 있지 않으면 사용자가 지정된 값을 삽입할 열을 식별해야 합니다.

INSERT 작업에 INSTEAD OF 트리거 사용

테이블이나 뷰에 대한 INSERT 작업에 INSTEAD-OF 트리거가 정의되면 INSERT 문 대신 트리거가 실행됩니다. 이전 버전의 SQL Server는 INSERT 및 기타 데이터 수정 문에 정의된 AFTER 트리거만 지원합니다. INSTEAD OF 트리거에 대한 자세한 내용은 CREATE TRIGGER(Transact-SQL)를 참조하십시오.

사용자 정의 유형 열에 값 삽입

다음과 같은 방법으로 사용자 정의 유형 열에 값을 삽입할 수 있습니다.

  • 사용자 정의 유형의 값을 제공합니다.

  • 사용자 정의 유형이 해당 형식의 암시적 또는 명시적인 변환을 지원하는 경우 SQL Server 2005 시스템 데이터 형식의 값을 제공합니다. 다음 예에서는 문자열의 명시적 변환을 통해 Point 사용자 정의 유형 열에 값을 삽입하는 방법을 보여 줍니다.

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

    모든 사용자 정의 유형은 이진 형식에서의 암시적 변환이 가능하기 때문에 명시적 변환을 수행하지 않고도 이진 값을 제공할 수 있습니다. 변환 및 사용자 정의 유형에 대한 자세한 내용은 사용자 정의 유형 작업 수행을 참조하십시오.

  • 사용자 정의 유형의 값을 반환하는 사용자 정의 함수를 호출합니다. 다음 예에서는 CreateNewPoint() 사용자 정의 함수를 사용하여 Point 사용자 정의 유형의 새 값을 만들고 이 값을 Cities 테이블에 삽입합니다.

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

OPENROWSET 및 BULK를 사용하여 데이터 대량 로드

SQL Server 2005 데이터베이스 엔진에서 OPENROWSET 대량 행 집합 공급자에 사용할 수 있는 새 테이블 힌트는 INSERT 문에 다음과 같은 대량 로드 최적화를 제공합니다.

  • 대량 로드 로깅(삽입 작업에 대한 로그 레코드의 수 최소화)
  • 제약 조건 검사를 ON 또는 OFF로 설정 가능
  • 트리거 실행을 ON 또는 OFF로 설정 가능

이러한 최적화는 BULK INSERT 명령에서 사용할 수 있는 최적화와 비슷합니다.

INSERT 문이 비어 있지 않은 테이블로 대량 로드를 수행하는 경우에는 다음과 같은 추가적인 성능 향상이 있습니다.

  • 대량 로드 중 페이지가 분할되는 경우 페이지에 추가되는 새 행을 모두 로깅할 필요는 없습니다.
  • 테이블에 비클러스터형 인덱스는 있지만 클러스터형 인덱스는 없는 경우 개별 인덱스 행은 모두 로깅해야 하지만 데이터 행을 모두 로깅할 필요는 없습니다.

자세한 내용은 OPENROWSET(Transact-SQL)테이블 힌트(Transact-SQL)를 참조하십시오.

사용 권한

대상 테이블에 대해 INSERT 권한이 필요합니다.

INSERT 권한은 sysadmin 고정 서버 역할, db_ownerdb_datawriter 고정 데이터베이스 역할의 멤버 그리고 테이블 소유자에게 기본적으로 부여됩니다. sysadmin, db_ownerdb_securityadmin 역할의 멤버와 테이블 소유자는 다른 사용자에게 권한을 양도할 수 있습니다.

OPENROWSET 함수에 BULK 옵션을 사용하여 INSERT를 실행하려면 sysadmin 고정 서버 역할 또는 bulkadmin 고정 서버 역할의 멤버여야 합니다.

1. 간단한 INSERT 문 사용

다음 예에서는 Production.UnitMeasure 테이블에 한 행을 삽입합니다. 모든 열에 대한 값이 제공되었고 값이 테이블 내의 열과 같은 순서로 나열되어 있기 때문에 column_list에 열 이름이 지정되어 있지 않아도 됩니다.

USE AdventureWorks;
GO
INSERT INTO Production.UnitMeasure
VALUES (N'F2', N'Square Feet', GETDATE());
GO

2. 테이블 열과 순서가 다른 데이터 삽입

다음 예에서는 column_list를 사용하여 각 열에 삽입되는 값을 명시적으로 지정합니다. UnitMeasure 테이블의 열 순서는 UnitMeasureCode, Name, ModifiedDate입니다. 하지만 column_list에는 이 순서대로 나열되어 있지 않습니다.

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

3. 열 수보다 적은 수의 데이터 값 삽입

다음 예에서는 자동으로 값을 생성하거나 기본값을 갖는 열이 있는 테이블에 행을 삽입하는 방법을 보여 줍니다. INSERT 문은 열의 전부가 아니라 일부에 대한 값만 포함하는 행을 삽입합니다. 마지막 INSERT 문에서는 아무 열도 지정하지 않고 기본값만 삽입합니다.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1 
(
    column_1 int IDENTITY, 
    column_2 varchar(30) 
        CONSTRAINT default_name DEFAULT ('my column default'),
    column_3 timestamp,
    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

4. ID 열이 있는 테이블에 데이터 삽입

다음 예에서는 ID 열에 데이터를 삽입하는 다양한 방법을 보여 줍니다. 처음의 두 INSERT 문은 새 행에 대해 ID 값을 생성할 수 있도록 허용합니다. 세 번째 INSERT 문은 SET IDENTITY_INSERT 문으로 열에 대한 IDENTITY 속성을 무시하고 ID 열에 명시적인 값을 삽입합니다.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
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

5. NEWID()를 사용하여 uniqueidentifier 열에 데이터 삽입

다음 예에서는 NEWID() 함수를 사용하여 column_2에 대한 GUID를 구합니다. 두 번째 INSERT 문에서 볼 수 있듯이 ID 열의 경우와 달리 uniqueidentifier 데이터 형식의 열에 대해서는 데이터베이스 엔진이 값을 자동으로 생성하지 않습니다.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
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;
GO

6. 뷰를 통해 테이블에 데이터 삽입

다음 예에서는 INSERT 문에 뷰 이름을 지정합니다. 하지만 새 행은 뷰의 기본 테이블에 삽입됩니다. 이때 INSERT 문에 있는 VALUES 목록의 순서가 뷰의 열 순서와 일치해야 합니다.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
    DROP TABLE dbo.T1;
GO
IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL
    DROP VIEW dbo.V1;
GO
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

7. SELECT 및 EXECUTE 옵션을 사용하여 데이터 삽입

다음 예에서는 한 테이블에서 데이터를 가져와서 다른 테이블에 삽입하는 3가지 방법을 보여 줍니다. 각 방법은 열 목록에 리터럴 값과 식을 포함하는 복수 테이블 SELECT 문을 기준으로 수행됩니다.

첫 번째 INSERT 문은 SELECT 문을 직접 사용하여 원본 테이블(Employee, SalesPersonContact)에서 데이터를 검색한 다음 결과 집합을 EmployeeSales 테이블에 저장합니다. 두 번째 INSERT 문은 SELECT 문을 포함한 저장 프로시저를 실행하며 세 번째 INSERT 문은 SELECT 문을 리터럴 문자열로 실행합니다.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
IF OBJECT_ID ('dbo.uspGetEmployeeSales', 'P') IS NOT NULL
    DROP PROCEDURE uspGetEmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( DataSource   varchar(20) NOT NULL,
  EmployeeID   varchar(11) NOT NULL,
  LastName     varchar(40) NOT NULL,
  SalesDollars money NOT NULL
);
GO
CREATE PROCEDURE dbo.uspGetEmployeeSales 
AS 
    SET NOCOUNT ON;
    SELECT 'PROCEDURE', e.EmployeeID, c.LastName, 
        sp.SalesYTD 
    FROM HumanResources.Employee AS e 
        INNER JOIN Sales.SalesPerson AS sp  
        ON e.EmployeeID = sp.SalesPersonID 
        INNER JOIN Person.Contact AS c
        ON e.ContactID = c.ContactID
    WHERE e.EmployeeID LIKE '2%'
    ORDER BY e.EmployeeID, c.LastName;
GO
--INSERT...SELECT example
INSERT dbo.EmployeeSales
    SELECT 'SELECT', e.EmployeeID, c.LastName, sp.SalesYTD 
    FROM HumanResources.Employee AS e
        INNER JOIN Sales.SalesPerson AS sp
        ON e.EmployeeID = sp.SalesPersonID 
        INNER JOIN Person.Contact AS c
        ON e.ContactID = c.ContactID
    WHERE e.EmployeeID LIKE '2%'
    ORDER BY e.EmployeeID, c.LastName;
GO
--INSERT...EXECUTE procedure example
INSERT EmployeeSales 
EXECUTE uspGetEmployeeSales;
GO
--INSERT...EXECUTE('string') example
INSERT EmployeeSales 
EXECUTE 
('
SELECT ''EXEC STRING'', e.EmployeeID, c.LastName, 
    sp.SalesYTD 
    FROM HumanResources.Employee AS e 
        INNER JOIN Sales.SalesPerson AS sp 
        ON e.EmployeeID = sp.SalesPersonID 
        INNER JOIN Person.Contact AS c
        ON e.ContactID = c.ContactID
    WHERE e.EmployeeID LIKE ''2%''
    ORDER BY e.EmployeeID, c.LastName
');
GO
--Show results.
SELECT DataSource,EmployeeID,LastName,SalesDollars
FROM dbo.EmployeeSales;
GO

8. TOP 절을 사용하여 데이터 삽입

다음 예에서는 NewEmployee 테이블을 만들고 Employee 테이블에서 상위 10명의 직원에 대한 주소 데이터를 이 테이블에 삽입합니다. 그런 다음 SELECT 문을 실행하여 NewEmployee 테이블의 내용을 확인합니다.

USE AdventureWorks;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
    DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
    EmployeeID int NOT NULL,
    LastName nvarchar(50) NOT NULL,
    FirstName nvarchar(50) NOT NULL,
    Phone 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
INSERT TOP (10) INTO HumanResources.NewEmployee 
    SELECT
       e.EmployeeID, c.LastName, c.FirstName, c.Phone,
       a.AddressLine1, a.City, sp.StateProvinceCode, 
       a.PostalCode, e.CurrentFlag
    FROM HumanResources.Employee e
        INNER JOIN HumanResources.EmployeeAddress AS ea
        ON e.EmployeeID = ea.EmployeeID
        INNER JOIN Person.Address AS a
        ON ea.AddressID = a.AddressID
        INNER JOIN Person.StateProvince AS sp
        ON a.StateProvinceID = sp.StateProvinceID
        INNER JOIN Person.Contact as c
        ON e.ContactID = c.ContactID;
GO
SELECT  EmployeeID, LastName, FirstName, Phone,
        AddressLine1, City, State, PostalCode, CurrentFlag
FROM HumanResources.NewEmployee;
GO

9. INSERT 문에 OUTPUT 사용

다음 예에서는 ScrapReason 테이블에 행을 삽입하고 OUTPUT 절을 사용하여 문의 결과를 @MyTableVartable 변수에 반환합니다. ScrapReasonID 열은 IDENTITY 속성으로 정의되었기 때문에 해당 열에 대한 INSERT 문에 값이 지정되지 않습니다. 하지만 해당 열에 대해 데이터베이스 엔진에서 생성한 값은 INSERTED.ScrapReasonID 열의 OUTPUT 절에 반환됩니다.

USE AdventureWorks;
GO
DECLARE @MyTableVar table( ScrapReasonID 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 ScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO

10. INSERT 문에 WITH 공통 테이블 식 사용

다음 예에서는 NewEmployee 테이블을 만듭니다. 공통 테이블 식(EmployeeTemp)은 NewEmployee 테이블에 삽입할 행을 정의합니다. INSERT 문은 공통 테이블 식의 해당 열을 참조합니다.

USE AdventureWorks;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
    DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
    EmployeeID int NOT NULL,
    LastName nvarchar(50) NOT NULL,
    FirstName nvarchar(50) NOT NULL,
    Phone 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.EmployeeID, c.LastName, c.FirstName, c.Phone,
        a.AddressLine1, a.City, sp.StateProvinceCode, 
        a.PostalCode, e.CurrentFlag
    FROM HumanResources.Employee e
        INNER JOIN HumanResources.EmployeeAddress AS ea
        ON e.EmployeeID = ea.EmployeeID
        INNER JOIN Person.Address AS a
        ON ea.AddressID = a.AddressID
        INNER JOIN Person.StateProvince AS sp
        ON a.StateProvinceID = sp.StateProvinceID
        INNER JOIN Person.Contact as c
        ON e.ContactID = c.ContactID
    )
INSERT INTO HumanResources.NewEmployee 
    SELECT EmpID, LastName, FirstName, Phone, 
           Address, City, StateProvince, PostalCode, CurrentFlag
    FROM EmployeeTemp;
GO

11. ID 열 및 계산 열에 OUTPUT 사용

다음 예에서는 EmployeeSales 테이블을 만든 다음 SELECT 문과 함께 INSERT 문을 사용하여 여러 행을 이 테이블에 삽입한 후 원본 테이블에서 데이터를 가져옵니다. EmployeeSales 테이블에는 ID 열(EmployeeID) 및 계산 열(ProjectedSales)이 포함되어 있습니다. 이러한 값은 삽입 작업 중에 데이터베이스 엔진에서 생성되므로 @MyTableVar에 이러한 열을 정의할 수 없습니다.

USE AdventureWorks ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
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 HumanResources.Employee AS e
        INNER JOIN Sales.SalesPerson AS sp
        ON e.EmployeeID = sp.SalesPersonID 
        INNER JOIN Person.Contact AS c
        ON e.ContactID = c.ContactID
    WHERE e.EmployeeID LIKE '2%'
    ORDER BY c.LastName, c.FirstName;

SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
GO

참고 항목

참조

BULK INSERT(Transact-SQL)
CREATE TABLE(Transact-SQL)
DELETE(Transact-SQL)
EXECUTE(Transact-SQL)
FROM(Transact-SQL)
IDENTITY(속성)(Transact-SQL)
NEWID(Transact-SQL)
SELECT(Transact-SQL)
SET ROWCOUNT (Transact-SQL)
UPDATE(Transact-SQL)

관련 자료

테이블에 데이터 삽입

도움말 및 정보

SQL Server 2005 지원 받기