다음을 통해 공유


대량 가져오기 수행 중 Null 유지 또는 기본값 사용

기본적으로 데이터를 테이블로 가져올 때 bcp 명령 및 BULK INSERT 문은 해당 테이블의 열에 정의되어 있는 기본값을 유지합니다. 예를 들어 데이터 파일에 null 필드가 있으면 열의 기본값이 대신 로드됩니다. bcp 명령 및 BULK INSERT 문을 사용하면 Null 값을 유지하도록 지정할 수 있습니다.

반대로 일반 INSERT 문은 기본값을 삽입하는 대신 Null 값을 유지합니다. INSERT ... SELECT * FROM OPENROWSET(BULK...) 문은 일반 INSERT와 같은 기본 동작을 제공하지만 기본값 삽입에 대한 테이블 힌트를 추가로 지원합니다.

[!참고]

테이블 열을 건너뛰는 예제 서식 파일은 서식 파일을 사용하여 테이블 열 건너뛰기을 참조하십시오.

예제 테이블 및 데이터 파일

이 항목의 예를 실행하려면 예제 테이블 및 데이터 파일을 만들어야 합니다.

예제 테이블

이 예에서는 dbo 스키마의 AdventureWorks2008R2 예제 데이터베이스에 생성된 MyTestDefaultCol2라는 테이블이 필요하며 이 테이블을 만들려면 Microsoft SQL Server Management Studio 쿼리 편집기에서 다음을 실행합니다.

USE AdventureWorks2008R2;
GO
CREATE TABLE MyTestDefaultCol2 
(Col1 smallint,
Col2 nvarchar(50) DEFAULT 'Default value of Col2',
Col3 nvarchar(50) 
);
GO

두 번째 테이블 열 Col2는 기본값을 가집니다.

예제 서식 파일

일부 대량 가져오기 예에서는 XML이 아닌 서식 파일(MyTestDefaultCol2-f-c.Fmt)을 사용하는데 이 파일은 MyTestDefaultCol2 테이블과 정확히 일치합니다. 이 서식 파일을 만들려면 Microsoft Windows 명령 프롬프트에서 다음을 입력합니다.

bcp AdventureWorks2008R2..MyTestDefaultCol2 format nul -c -f C:\MyTestDefaultCol2-f-c.Fmt -t, -r\n -T

서식 파일을 만드는 방법은 서식 파일 만들기를 참조하십시오.

예제 데이터 파일

이 예에서는 예제 데이터 파일(MyTestEmptyField2-c.Dat)을 사용하는데 이 파일은 두 번째 필드에 값이 없습니다. MyTestEmptyField2-c.Dat 데이터 파일에는 다음 레코드가 포함됩니다.

1,,DataField3
2,,DataField3

bcp 또는 BULK INSERT로 Null 값 유지

다음 한정자는 대량 가져오기 작업 중 테이블 열에 대한 기본값(있는 경우)을 상속하기보다는 데이터 파일의 빈 필드에 Null 값을 유지하도록 지정합니다.

명령

한정자

한정자 유형

bcp

-k

스위치

BULK INSERT

KEEPNULLS1

Argument

1 BULK INSERT의 경우 기본값을 사용할 수 없으면 테이블 열에서 Null 값을 허용하도록 정의해야 합니다.

[!참고]

이러한 한정자는 대량 가져오기 명령을 통해 테이블에서 DEFAULT 정의 확인을 비활성화합니다. 그러나 동시 INSERT 문의 경우 DEFAULT 정의가 있어야 합니다.

자세한 내용은 bcp 유틸리티BULK INSERT(Transact-SQL)를 참조하십시오.

이 섹션의 예에서는 bcp 또는 BULK INSERT를 사용하여 대량 가져오기를 수행하고 Null 값을 유지합니다.

두 번째 테이블 열 Col2는 기본값을 가집니다. 데이터 파일의 해당되는 필드에는 빈 문자열이 포함됩니다. 기본적으로 bcp 또는 BULK INSERT를 사용하여 이 데이터 파일에서 MyTestDefaultCol2 테이블로 데이터를 가져올 때 Col2의 기본값이 삽입되어 다음과 같은 결과가 생성됩니다.

1

Default value of Col2

DataField3

2

Default value of Col2

DataField3

"Default value of Col2" 대신 "NULL"을 삽입하려면 다음 bcp 및 BULK INSERT 예에서 예시한 대로 -k 스위치 또는 KEEPNULL 옵션을 사용해야 합니다.

bcp 사용 및 Null 값 유지

다음 예에서는 bcp 명령에서 Null 값을 유지하는 방법을 예시합니다. bcp 명령에는 다음 스위치가 포함됩니다.

스위치

설명

-f

해당 명령에서 서식 파일을 사용하도록 지정합니다.

-k

작업 시 삽입된 열에 기본값이 지정되지 않고 빈 열이 Null 값을 보유하도록 지정합니다.

-T

bcp 유틸리티가 트러스트된 연결을 통해 SQL Server로 연결되도록 지정합니다.

Windows 명령 프롬프트에서 다음을 입력합니다.

bcp AdventureWorks2008R2..MyTestDefaultCol2 in C:\MyTestEmptyField2-c.Dat -f C:\MyTestDefaultCol2-f-c.Fmt -k -T

BULK INSERT 사용 및 Null 값 유지

다음 예에서는 BULK INSERT 문에서 KEEPNULLS 옵션을 사용하는 방법을 보여 줍니다. SQL Server Management Studio 쿼리 편집기 같은 쿼리 도구에서 다음을 실행합니다.

USE AdventureWorks2008R2;
GO
BULK INSERT MyTestDefaultCol2
   FROM 'C:\MyTestEmptyField2-c.Dat'
   WITH (
      DATAFILETYPE = 'char',
      FIELDTERMINATOR = ',',
      KEEPNULLS
   );
GO

INSERT ... SELECT * FROM OPENROWSET(BULK...)을 사용하여 기본값 유지

기본적으로 대량 로드 작업에 지정되어 있지 않은 열은 INSERT ... SELECT * FROM OPENROWSET(BULK...)에 의해 Null로 설정됩니다. 그러나 데이터 파일의 빈 필드의 경우 해당 테이블 열에서 기본값(있는 경우)을 사용하도록 지정할 수 있습니다. 기본값을 사용하려면 다음 테이블 힌트를 지정하십시오.

명령

한정자

한정자 유형

INSERT ... SELECT * FROM OPENROWSET(BULK...)

WITH(KEEPDEFAULTS)

테이블 힌트

[!참고]

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

다음 INSERT ... SELECT * FROM OPENROWSET(BULK...) 예는 데이터를 대량으로 가져오고 기본값을 유지합니다.

이 예를 실행하려면 MyTestDefaultCol2 예제 테이블과 MyTestEmptyField2-c.Dat 데이터 파일을 만들고 MyTestDefaultCol2-f-c.Fmt 서식 파일을 사용해야 합니다. 이러한 예제를 만드는 방법은 이 항목의 앞 부분에 있는 "예제 테이블 및 데이터 파일"을 참조하십시오.

두 번째 테이블 열 Col2는 기본값을 가집니다. 데이터 파일의 해당되는 필드에는 빈 문자열이 포함됩니다. INSERT ... SELECT * FROM OPENROWSET(BULK...)으로 이 데이터 파일의 필드를 MyTestDefaultCol2 테이블로 가져올 때 기본적으로 기본값 대신 NULL이 Col2로 삽입됩니다. 이 기본 동작을 통해 다음과 같은 결과가 나타납니다.

1

NULL

DataField3

2

NULL

DataField3

"NULL" 대신 기본값인 "Default value of Col2" 를 삽입하려면 다음 예에서 예시하는 대로 KEEPDEFAULTS 테이블 힌트를 사용해야 합니다. SQL Server Management Studio 쿼리 편집기 같은 쿼리 도구에서 다음을 실행합니다.

USE AdventureWorks2008R2;
GO
INSERT INTO MyTestDefaultCol2
    WITH (KEEPDEFAULTS)
    SELECT *
      FROM OPENROWSET(BULK  'C:\MyTestEmptyField2-c.Dat',
      FORMATFILE='C:\MyTestDefaultCol2-f-c.Fmt'     
      ) as t1 ;
GO