대량 가져오기 수행 중 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