이전 SQL Server 버전 관련 새로운 날짜/시간 기능(OLE DB)
이 항목에서는 향상된 날짜 및 시간 기능을 사용하는 클라이언트 응용 프로그램이 SQL Server 2008보다 이전 버전의 SQL Server와 통신할 때, 그리고 SQL Server 2008보다 이전 버전의 SQL Server Native Client를 사용하여 컴파일한 클라이언트가 향상된 날짜 및 시간 기능을 지원하는 서버에 명령을 전송할 때 예상되는 동작에 대해 설명합니다.
하위 수준 클라이언트 동작
SQL Server 2008보다 이전 버전의 SQL Server Native Client를 사용하는 클라이언트 응용 프로그램에서는 새로운 날짜/시간 형식을 nvarchar 열로 인식합니다. 열의 내용은 리터럴 표현입니다. 자세한 내용은 OLE DB 날짜/시간 기능 향상을 위한 데이터 형식 지원의 "데이터 형식: 문자열 및 리터럴" 섹션을 참조하십시오. 열 크기는 열에 지정된 전체 자릿수에 대한 최대 리터럴 길이입니다.
카탈로그 API는 클라이언트에 반환된 하위 수준 데이터 형식 코드(예: nvarchar)와 일관된 메타데이터 및 관련된 하위 수준 표현(예: 적절한 리터럴 형식)을 반환합니다. 그러나 반환되는 데이터 형식의 이름은 실제 SQL Server 2008 형식 이름입니다.
날짜/시간 형식과 관련하여 스키마가 변경된 SQL Server 2008 서버에 대해 하위 수준 클라이언트 응용 프로그램이 실행될 경우 예상되는 동작은 다음과 같습니다.
OLE DB 클라이언트 형식 |
SQL Server 2005 형식 |
SQL Server 2008 형식 |
결과 변환(서버에서 클라이언트로) |
매개 변수 변환(클라이언트에서 서버로) |
|---|---|---|---|---|
DBTYPE_DBDATE |
Datetime |
Date |
확인 |
확인 |
DBTYPE_DBTIMESTAMP |
시간 필드가 0으로 설정됩니다. |
시간 필드가 0이 아닌 경우 IRowsetChange는 문자열 잘림으로 인해 실패합니다. |
||
DBTYPE_DBTIME |
Time(0) |
확인 |
확인 |
|
DBTYPE_DBTIMESTAMP |
날짜 필드가 현재 날짜로 설정됩니다. |
소수 자릿수 초가 0이 아닌 경우 IRowsetChange는 문자열 잘림으로 인해 실패합니다. 날짜는 무시됩니다. |
||
DBTYPE_DBTIME |
Time(7) |
실패 – 시간 리터럴이 잘못되었습니다. |
확인 |
|
DBTYPE_DBTIMESTAMP |
실패 – 시간 리터럴이 잘못되었습니다. |
확인 |
||
DBTYPE_DBTIMESTAMP |
Datetime2(3) |
확인 |
확인 |
|
DBTYPE_DBTIMESTAMP |
Datetime2(7) |
확인 |
확인 |
|
DBTYPE_DBDATE |
Smalldatetime |
Date |
확인 |
확인 |
DBTYPE_DBTIMESTAMP |
시간 필드가 0으로 설정됩니다. |
시간 필드가 0이 아닌 경우 IRowsetChange는 문자열 잘림으로 인해 실패합니다. |
||
DBTYPE_DBTIME |
Time(0) |
확인 |
확인 |
|
DBTYPE_DBTIMESTAMP |
날짜 필드가 현재 날짜로 설정됩니다. |
소수 자릿수 초가 0이 아닌 경우 IRowsetChange는 문자열 잘림으로 인해 실패합니다. 날짜는 무시됩니다. |
||
DBTYPE_DBTIMESTAMP |
Datetime2(0) |
확인 |
확인 |
표에서 확인은 SQL Server 2005에서 동작하는 경우 SQL Server 2008에서도 계속 동작함을 의미합니다.
다음과 같은 일반적인 스키마 변경 내용만 고려됩니다.
논리적으로 응용 프로그램에 날짜 또는 시간 값만 필요한 경우 새 형식을 사용합니다. 그러나 이전에는 개별 날짜 및 시간 형식을 사용할 수 없었으므로 응용 프로그램에서 datetime 또는 smalldatetime을 사용해야 했습니다.
초 소수 부분 자릿수를 늘리거나 정확도를 높이기 위해 새 형식을 사용합니다.
datetime2가 선호하는 날짜 및 시간 데이터 형식이기 때문에 datetime2로 전환합니다.
ICommandWithParameters::GetParameterInfo 또는 스키마 행 집합을 통해 가져온 서버 메타데이터를 사용하여 ICommandWithParameters::SetParameterInfo를 통해 매개 변수 형식 정보를 설정하는 응용 프로그램은 원본 유형의 문자열 표현이 대상 유형의 문자열 표현보다 큰 경우 클라이언트 변환 도중 실패합니다. 예를 들어 클라이언트 바인딩이 DBTYPE_DBTIMESTAMP를 사용하고 서버 열이 날짜인 경우 SQL Server Native Client는 값을 "yyyy-dd-mm hh:mm:ss.fff"로 변환하지만 서버 메타데이터는 nvarchar(10)로 반환됩니다. 결과 오버플로는 DBSTATUS_E_CATCONVERTVALUE를 유발합니다. 행 집합 메타데이터는 결과 집합 메타데이터에서 설정되므로 IRowsetChange에 의한 데이터 변환에서도 비슷한 문제가 발생합니다.
매개 변수 및 행 집합 메타데이터
이 섹션에서는 SQL Server 2008보다 이전 버전의 SQL Server Native Client로 컴파일된 클라이언트의 매개 변수, 결과 열 및 스키마 행 집합에 대한 메타데이터에 대해 설명합니다.
ICommandWithParameters::GetParameterInfo
DBPARAMINFO 구조는 prgParamInfo 매개 변수를 통해 다음 정보를 반환합니다.
매개 변수 유형 |
wType |
ulParamSize |
bPrecision |
bScale |
|---|---|---|---|---|
date |
DBTYPE_WSTR |
10 |
~0 |
~0 |
time |
DBTYPE_WSTR |
8, 10..16 |
~0 |
~0 |
smalldatetime |
DBTYPE_DBTIMESTAMP |
16 |
16 |
0 |
datetime |
DBTYPE_DBTIMESTAMP |
16 |
23 |
3 |
datetime2 |
DBTYPE_WSTR |
19,21..27 |
~0 |
~0 |
datetimeoffset |
DBTYPE_WSTR |
26,28..34 |
~0 |
~0 |
이러한 값 범위 중 일부는 연속되지 않습니다. 예를 들어 8, 10..16에서는 9가 누락되어 있습니다. 이러한 경우는 소수 부분 자릿수가 0보다 커서 소수점을 추가했을 때 발생합니다.
IColumnsRowset::GetColumnsRowset
다음 열이 반환됩니다.
열 유형 |
DBCOLUMN_TYPE |
DBCOLUMN_COLUMNSIZE |
DBCOLUMN_PRECISION |
DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION |
|---|---|---|---|---|
date |
DBTYPE_WSTR |
10 |
NULL |
NULL |
time |
DBTYPE_WSTR |
8, 10..16 |
NULL |
NULL |
smalldatetime |
DBTYPE_DBTIMESTAMP |
16 |
16 |
0 |
datetime |
DBTYPE_DBTIMESTAMP |
16 |
23 |
3 |
datetime2 |
DBTYPE_WSTR |
19,21..27 |
NULL |
NULL |
datetimeoffset |
DBTYPE_WSTR |
26,28..34 |
NULL |
NULL |
ColumnsInfo::GetColumnInfo
DBCOLUMNINFO 구조는 다음 정보를 반환합니다.
매개 변수 유형 |
wType |
ulColumnSize |
bPrecision |
bScale |
|---|---|---|---|---|
date |
DBTYPE_WSTR |
10 |
~0 |
~0 |
time(1..7) |
DBTYPE_WSTR |
8, 10..16 |
~0 |
~0 |
smalldatetime |
DBTYPE_DBTIMESTAMP |
16 |
16 |
0 |
datetime |
DBTYPE_DBTIMESTAMP |
16 |
23 |
3 |
datetime2 |
DBTYPE_WSTR |
19,21..27 |
~0 |
~0 |
datetimeoffset |
DBTYPE_WSTR |
26,28..34 |
~0 |
~0 |
스키마 행 집합
이 섹션에서는 새 데이터 형식의 매개 변수, 결과 열 및 스키마 행 집합에 대한 메타데이터에 대해 설명합니다. 이 정보는 SQL Server 2008SQL Server Native Client보다 이전 버전의 도구를 사용하여 개발된 클라이언트 공급자를 사용하는 경우 유용합니다.
COLUMNS 행 집합
날짜/시간 형식에 대해 다음 열 값이 반환됩니다.
열 유형 |
DATA_TYPE |
CHARACTER_MAXIMUM_LENGTH |
CHARACTER_OCTET_LENGTH |
DATETIME_PRECISION |
|---|---|---|---|---|
date |
DBTYPE_WSTR |
10 |
20 |
NULL |
time |
DBTYPE_WSTR |
8, 10..16 |
16,20..32 |
NULL |
smalldatetime |
DBTYPE_DBTIMESTAMP |
NULL |
NULL |
0 |
datetime |
DBTYPE_DBTIMESTAMP |
NULL |
NULL |
3 |
datetime2 |
DBTYPE_WSTR |
19,21..27 |
38,42..54 |
NULL |
datetimeoffset |
DBTYPE_WSTR |
26,28..34 |
52, 56..68 |
NULL |
PROCEDURE_PARAMETERS 행 집합
날짜/시간 형식에 대해 다음 열 값이 반환됩니다.
열 유형 |
DATA_TYPE |
CHARACTER_MAXIMUM_LENGTH |
CHARACTER_OCTET_LENGTH |
TYPE_NAME LOCAL_TYPE_NAME |
|---|---|---|---|---|
date |
DBTYPE_WSTR |
10 |
20 |
date |
time |
DBTYPE_WSTR |
8, 10..16 |
16,20..32 |
time |
smalldatetime |
DBTYPE_DBTIMESTAMP |
NULL |
NULL |
smalldatetime |
datetime |
DBTYPE_DBTIMESTAMP |
NULL |
NULL |
datetime |
datetime2 |
DBTYPE_WSTR |
19,21..27 |
38,42..54 |
datetime2 |
datetimeoffset |
DBTYPE_WSTR |
26,28..34 |
52, 56..68 |
datetimeoffset |
PROVIDER_TYPES 행 집합
날짜/시간 형식에 대해 다음 행이 반환됩니다.
형식 -> 열 |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
|---|---|---|---|---|---|---|
TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
DATA_TYPE |
DBTYPE_WSTR |
DBTYPE_WSTR |
DBTYPE_DBTIMESTAMP |
DBTYPE_DBTIMESTAMP |
DBTYPE_WSTR |
DBTYPE_WSTR |
COLUMN_SIZE |
10 |
16 |
16 |
23 |
27 |
34 |
LITERAL_PREFIX |
‘ |
‘ |
‘ |
‘ |
‘ |
‘ |
LITERAL_SUFFIX |
‘ |
‘ |
‘ |
‘ |
‘ |
‘ |
CREATE_PARAMS |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
IS_NULLABLE |
VARIANT_TRUE |
VARIANT_TRUE |
VARIANT_TRUE |
VARIANT_TRUE |
VARIANT_TRUE |
VARIANT_TRUE |
CASE_SENSITIVE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
SEARCHABLE |
DB_SEARCHABLE |
DB_SEARCHABLE |
DB_SEARCHABLE |
DB_SEARCHABLE |
DB_SEARCHABLE |
DB_SEARCHABLE |
UNSIGNED_ATTRIBUTE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
FIXED_PREC_SCALE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
AUTO_UNIQUE_VALUE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
LOCAL_TYPE_NAME |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
MINIMUM_SCALE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
MAXIMUM_SCALE |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
GUID |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
TYPELIB |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
VERSION |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
IS_LONG |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
BEST_MATCH |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_TRUE |
VARIANT_FALSE |
VARIANT_FALSE |
IS_FIXEDLENGTH |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
VARIANT_FALSE |
하위 수준 서버 동작
SQL Server 2008보다 이전 버전의 서버에 연결되는 경우 새 서버 유형 이름을 사용하려는 모든 시도는(예: ICommandWithParameters::SetParameterInfo 또는 ITableDefinition::CreateTable 사용) DB_E_BADTYPENAME으로 이어집니다.
새 형식이 형식 이름을 사용하지 않고 매개 변수 또는 결과에 바인딩되고, 새 형식을 사용하여 서버 유형을 암시적으로 지정하거나 서버 유형에서 클라이언트 유형으로의 유효한 변환이 없는 경우 DB_E_ERRORSOCCURRED가 반환되고 DBBINDSTATUS_UNSUPPORTED_CONVERSION이 Execute에 사용된 접근자에 대한 바인딩 상태로 설정됩니다.
버퍼 유형에서 연결의 서버 버전의 서버 유형으로 지원되는 클라이언트 변환이 있는 경우 모든 클라이언트 버퍼 유형을 사용할 수 있습니다. 여기에서 서버 유형은 ICommandWithParameters::SetParameterInfo에 의해 지정된 유형, 또는 ICommandWithParameters::SetParameterInfo가 호출되지 않은 경우 버퍼 유형에 의해 암시적으로 지정된 유형을 의미합니다. 이는 하위 수준 서버에서, 또는 DataTypeCompatibility=80일 때 지원되는 서버 유형에 대한 클라이언트 변환이 성공할 경우 DBTYPE_DBTIME2 및 DBTYPE_DBTIMESTAMPOFFSET을 사용할 수 있음을 의미합니다. 물론 서버 유형이 잘못된 경우 서버는 실제 서버 유형으로 암시적 변환을 수행하지 못하면 여전히 오류를 보고할 수 있습니다.
SSPROP_INIT_DATATYPECOMPATIBILITY 동작
SSPROP_INIT_DATATYPECOMPATIBILITY가 SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000으로 설정되면 새 날짜/시간 형식 및 관련 메타데이터는 향상된 날짜/시간 형식에 대한 대량 복사 변경 사항(OLE DB 및 ODBC)에 설명된 대로 하위 수준 클라이언트에 대해 표시될 때와 동일하게 클라이언트에 표시됩니다.
IRowsetFind 비교
새 날짜/시간 형식은 날짜/시간 형식이 아니라 문자열 형식으로 표시되기 때문에 이러한 형식에 대해서는 모든 비교 연산자를 사용할 수 있습니다.