향상된 날짜 및 시간 유형에 대한 대량 복사 변경 내용(OLE DB 및 ODBC)
적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System(PDW)
이 항목에서는 대량 복사 기능을 지원하기 위한 날짜/시간 향상에 대해 설명합니다. 이 항목의 정보는 SQL Server Native Client의 OLE DB 및 ODBC 모두에 유효합니다.
Important
SQL Server Native Client(약칭 SNAC)는 SQL Server 2022(16.x) 및 SSMS(SQL Server Management Studio) 19에서 제거되었습니다. SQL Server Native Client(SQLNCLI 또는 SQLNCLI11) 및 레거시 Microsoft OLE DB Provider for SQL Server(SQLOLEDB)는 새 애플리케이션 개발에 권장되지 않습니다. 앞으로 새 SQL Server용 Microsoft OLE DB 드라이버(MSOLEDBSQL) 또는 최신 Microsoft ODBC Driver for SQL Server로 전환합니다. SQL Server 데이터베이스 엔진(버전 2012~2019)의 구성 요소로 제공되는 SQLNCLI의 경우 이 지원 수명 주기 예외를 참조하세요.
파일 서식 지정
형식 파일을 대화형으로 빌드할 때 다음 표에서는 날짜/시간 형식 및 해당 호스트 파일 데이터 형식 이름을 지정하는 데 사용되는 입력에 대해 설명합니다.
파일 스토리지 유형 | 호스트 파일 데이터 형식 | 프롬프트에 대한 응답: "Enter the file storage type of field <field_name> [<default>]:" |
---|---|---|
날짜/시간 | SQLDATETIME | 일 |
Smalldatetime | SQLDATETIM4 | D |
날짜 | SQLDATE | de |
시간 | SQLTIME | te |
Datetime2 | SQLDATETIME2 | d2 |
Datetimeoffset | SQLDATETIMEOFFSET | do |
XML 서식 파일 XSD에는 다음과 같은 추가 사항이 있습니다.
<xs:complexType name="SQLDATETIME2">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SQLDATETIMEOFFSET">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SQLDATE">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SQLTIME">
<xs:complexContent>
<xs:extension base="bl:Fixed"/>
</xs:complexContent>
</xs:complexType>
문자 데이터 파일
문자 데이터 파일에서 날짜 및 시간 값은 ODBC에 대한 ODBC 날짜 및 시간 개선에 대한 데이터 형식 지원의 "데이터 형식: 문자열 및 리터럴" 섹션 또는 OLE DB에 대한 OLE DB 날짜 및 시간 개선에 대한 데이터 형식 지원에 설명된 대로 표시됩니다.
네이티브 데이터 fles에서 4개의 새 형식에 대한 날짜 및 시간 값은 크기가 7인 TDS 표현으로 표시됩니다(이는 SQL Server에서 지원하는 최대값이며 bcp 데이터 파일은 이러한 열의 배율을 저장하지 않기 때문). 기존 datetime 및 smalldatetime 형식 또는 TDS(테이블 형식 데이터 스트림) 표현의 스토리지는 변경되지 않습니다.
다른 스토리지 유형의 스토리지 크기는 OLE DB의 경우 다음과 같습니다.
파일 스토리지 유형 | 스토리지 크기(바이트) |
---|---|
Datetime | 8 |
smalldatetime | 4 |
날짜 | 3 |
시간 | 6 |
datetime2 | 9 |
datetimeoffset | 11 |
크기는 ODBC의 경우 다음과 같습니다. BCP.exe는 항상 서버에서 전체 자릿수를 검색하므로 전체 자릿수를 형식 또는 데이터 파일로 저장할 필요는 없습니다.
파일 스토리지 유형 | 스토리지 크기(바이트) | 스토리지 형식 |
---|---|---|
datetime(d) | 8 | TDS |
smalldatetime(D) | 4 | TDS |
date(de) | 3 | TDS |
time(te) | 6 | TDS |
datetime2(d2) | 9 | TDS |
datetimeoffset(do) | 11 | TDS |
sqlncli.h의 BCP 형식
다음 형식은 ODBC에 대한 BCP API 확장에 사용할 수 있도록 sqlncli.h에 정의됩니다. 이러한 형식은 OLE DB에서 IBCPSession::BCPColFmt의 eUserDataType 매개 변수와 함께 전달됩니다.
파일 스토리지 유형 | 호스트 파일 데이터 형식 | IBCPSession::BCPColFmt에서 사용할 sqlncli.h를 입력합니다. | 값 |
---|---|---|---|
날짜/시간 | SQLDATETIME | BCP_TYPE_SQLDATETIME | 0x3d |
Smalldatetime | SQLDATETIM4 | BCP_TYPE_SQLDATETIME4 | 0x3a |
날짜 | SQLDATE | BCP_TYPE_SQLDATE | 0x28 |
시간 | SQLTIME | BCP_TYPE_SQLTIME | 0x29 |
Datetime2 | SQLDATETIME2 | BCP_TYPE_SQLDATETIME2 | 0x2a |
Datetimeoffset | SQLDATETIMEOFFSET | BCP_TYPE_SQLDATETIMEOFFSET | 0x2b |
BCP 데이터 형식 변환
다음 표에서는 변환 정보를 보여 줍니다.
OLE DB 참고 다음 변환은 IBCPSession에서 수행됩니다. IRowsetFastLoad는 클라이언트에서 서버로 수행되는 변환에 정의된 OLE DB 변환을 사용합니다. datetime 값은 1/300초로 반올림되며 smalldatetime 값은 아래에 설명된 클라이언트 변환이 수행된 후 0초로 설정됩니다. 날짜/시간 반올림은 시간과 분을 통해 전파되지만 날짜는 전파되지 않습니다.
To --> 보낸 사람 |
date | time | smalldatetime | Datetime | datetime2 | datetimeoffset | char | wchar |
---|---|---|---|---|---|---|---|---|
날짜 | 6 | - | 1,6 | 1,6 | 1,6 | 1,5,6 | 1,3 | 1,3 |
시간 | 해당 없음 | 1,10 | 1,7,10 | 1,7,10 | 1,7,10 | 1,5,7,10 | 1,3 | 1,3 |
Smalldatetime | 1,2 | 1,4,10 | 6 | 6 | 1,10 | 1,5,10 | 1,11 | 1,11 |
날짜/시간 | 1,2 | 1,4,10 | 1,12 | 6 | 1,10 | 1,5,10 | 1,11 | 1,11 |
Datetime2 | 1,2 | 1,4,10 | 1,10(ODBC)1,12(OLE DB) | 1,10 | 1,10 | 1,5,10 | 1,3 | 1,3 |
Datetimeoffset | 1,2,8 | 1,4,8,10 | 1,8,10 | 1,8,10 | 1,8,10 | 1,10 | 1,3 | 1,3 |
Char/wchar(date) | 9 | - | 9,6(ODBC)9,6,12(OLE DB) | 9,6(ODBC)9,6,12(OLE DB) | 9,6 | 9,5,6 | 해당 없음 | 해당 없음 |
Char/wchar(time) | - | 9,10 | 9,7,10(ODBC)9,7,10,12(OLE DB) | 9,7,10(ODBC)9,7,10,12(OLE DB) | 9,7,10 | 9,5,7,10 | 해당 없음 | 해당 없음 |
Char/wchar(datetime) | 9,2 | 9,4,10 | 9,10(ODBC)9,10,12(OLE DB) | 9,10(ODBC)9,10,12(OLE DB) | 9,10 | 9,5,10 | 해당 없음 | 해당 없음 |
Char/wchar(datetimeoffset) | 9,2,8 | 9,4,8,10 | 9,8,10(ODBC)9,8,10,12(OLE DB) | 9,8,10(ODBC)9,8,10,12(OLE DB) | 9,8,10 | 9,10 | 해당 없음 | 해당 없음 |
기호 설명
기호 | 의미 |
---|---|
- | 변환이 지원되지 않습니다. ODBC 진단 레코드는 SQLSTATE 07006 및 "제한된 데이터 형식 특성 위반" 메시지와 함께 생성됩니다. |
6 | 제공된 데이터가 유효하지 않으면 SQLSTATE 22007 및 "잘못된 날짜/시간 형식"이라는 메시지와 함께 ODBC 진단 레코드가 생성됩니다. datetimeoffset 값의 경우 UTC로의 변환이 요청되지 않더라도 시간 부분은 UTC로 변환한 후 범위 내에 있어야 합니다. 이는 TDS와 서버가 항상 UTC에 대한 datetimeoffset 값의 시간을 정규화하기 때문입니다. 따라서 클라이언트는 시간 구성 요소가 UTC로 변환한 후 지원되는 범위 내에 있는지 확인해야 합니다. |
2 | 시간 구성 요소는 무시됩니다. |
3 | ODBC의 경우 데이터 손실이 있는 잘림이 발생하면 SQLSTATE 22001과 '문자열 데이터, 오른쪽 잘린' 메시지로 진단 레코드가 생성됩니다. 소수 자릿수(소수 자릿수)의 수는 다음 표에 따라 대상 열의 크기에서 결정됩니다. 테이블의 범위보다 큰 열 크기의 경우 7의 배율을 암시합니다. 이 변환은 ODBC에서 허용하는 최대값인 최대 9개의 소수 자릿수 초 자릿수를 허용해야 합니다. 형식: DBTIME2 암시적 소수 자릿수 0 8 암시적 배율 1..7 10,16 형식: DBTIMESTAMP 암시적 소수 자릿수 0: 19 암시적 배율 1..7: 21..27 형식: DBTIMESTAMPOFFSET 암시적 소수 자릿수 0: 26 암시된 소수 자릿수 1..7: 28..34 OLE DB의 경우 데이터 손실로 잘림이 발생하면 오류가 게시됩니다. datetime2의 경우 다음 표에 따라 소수 자릿수 초 숫자(소수 자릿수)가 대상 열의 크기에서 결정됩니다. 테이블의 범위보다 큰 열 크기의 경우 9의 배율을 암시합니다. 이 변환은 소수 자릿수 초의 자릿수를 OLE DB에서 허용하는 최대값인 9자리까지 허용합니다. 형식: DBTIME2 암시적 소수 자릿수 0 8 암시적 배율 1..9 1..9 형식: DBTIMESTAMP 암시적 소수 자릿수 0: 19 암시적 배율 1..9: 21..29 형식: DBTIMESTAMPOFFSET 암시적 소수 자릿수 0: 26 암시적 배율 1..9: 28..36 |
4 | 날짜 구성 요소가 무시됩니다. |
5 | 표준 시간대는 UTC(예: 00:00)로 설정됩니다. |
6 | 시간이 0으로 설정됩니다. |
7 | 날짜는 1900-01-01로 설정됩니다. |
8 | 표준 시간대 오프셋은 무시됩니다. |
9 | 첫 번째 문장 부호 문자 및 나머지 구성 요소가 있는지 여부에 따라 문자열이 date, datetime, datetimeoffset 또는 time 값으로 구문 분석된 후 변환됩니다. 그런 다음 이 프로세스에서 검색한 원본 형식에 대해 이 항목의 끝에 있는 테이블의 규칙에 따라 문자열을 대상 형식으로 변환합니다. 제공된 데이터를 오류 없이 구문 분석할 수 없거나, 구성 요소 중 하나라도 허용 범위 밖에 있거나, 리터럴 형식에서 대상 형식으로의 변환이 없으면, 오류가 게시되거나(OLE DB) SQLSTATE 22018 및 "캐스트 사양의 문자 값이 올바르지 않습니다."라는 메시지가 포함된 ODBC 진단 레코드가 생성됩니다. datetime 및 smalldatetime 매개 변수의 경우 연도가 이러한 형식에서 지원하는 범위 밖에 있으면 오류가 게시되거나(OLE DB), SQLSATE 22007 및 "잘못된 날짜 시간 형식입니다."라는 메시지가 포함된 ODBC 진단 레코드가 생성됩니다. datetimeoffset의 경우 UTC로의 변환이 요청되지 않더라도 값은 UTC로 변환한 후 범위 내에 있어야 합니다. 이는 TDS와 서버가 항상 UTC에 대한 datetimeoffset 값의 시간을 정규화하므로 클라이언트는 시간 구성 요소가 UTC로 변환한 후 지원되는 범위 내에 있는지 확인해야 하기 때문입니다. 값이 지원되는 UTC 범위 내에 있지 않으면 오류가 게시되거나(OLE DB) ODBC 진단 레코드가 SQLSTATE 22007 및 "잘못된 날짜/시간 형식"으로 생성됩니다. |
10 | 클라이언트에서 서버로의 변환 시 잘림을 수행하여 데이터 손실이 발생하면 오류가 게시되거나(OLE DB), SQLSTATE 22008 및 "Datetime 필드 오버플로"라는 메시지가 포함된 ODBC 진단 레코드가 생성됩니다. 이 오류는 값이 서버에서 사용하는 UTC 범위로 나타낼 수 있는 범위를 벗어나는 경우에도 발생합니다. 서버에서 클라이언트로의 변환에서 초 또는 소수 자릿수 초 잘림이 발생하는 경우 경고만 있습니다. |
11 | 잘림을 수행하여 데이터 손실이 발생하면 진단 레코드가 생성됩니다. 서버에서 클라이언트로 변환할 경우에는 경고(ODBC SQLSTATE S1000)입니다. 클라이언트-서버 변환에서 오류입니다(ODBC SQLSTATE 22001). |
12 | 초는 0으로 설정되고 소수 자릿수 초는 무시됩니다. 잘림 오류는 없습니다. |
해당 없음 | 기존 SQL Server 2005(9.x) 및 이전 동작은 유지 관리됩니다. |
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기