이전 SQL Server 버전의 새 날짜 및 시간 기능(OLE DB)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
이 항목에서는 향상된 날짜 및 시간 기능을 사용하는 클라이언트 애플리케이션이 SQL Server 2008(10.0.x) 이전 버전의 SQL Server와 통신하고 SQL Server 2008(10.0.x) 이전 버전의 SQL Server Native Client로 컴파일된 클라이언트가 향상된 날짜 및 시간 기능을 지원하는 서버에 명령을 보낼 때 예상되는 동작에 대해 설명합니다.
하위 수준 클라이언트 동작
SQL Server 2008(10.0.x) 이전 버전의 SQL Server Native Client를 사용하는 클라이언트 애플리케이션은 새 날짜/시간 유형을 nvarchar 열로 표시합니다. 열 내용은 리터럴 표현입니다. 자세한 내용은 OLE DB 날짜 및 시간 개선에 대한 데이터 형식 지원의 "데이터 형식: 문자열 및 리터럴" 섹션을 참조하세요. 열 크기는 열에 지정된 전체 자릿수의 최대 리터럴 길이입니다.
카탈로그 API는 클라이언트에 반환된 하위 수준 데이터 형식 코드(예 : nvarchar) 및 연결된 하위 수준 표현(예: 적절한 리터럴 형식)과 일치하는 메타데이터를 반환합니다. 그러나 반환되는 데이터 형식 이름은 실제 SQL Server 2008(10.0.x) 형식 이름이 됩니다.
날짜/시간 형식에 대한 스키마 변경이 수행된 SQL Server 2008(10.0.x) 이상 서버에 대해 하위 수준 클라이언트 애플리케이션이 실행되는 경우 예상 동작은 다음과 같습니다.
OLE DB 클라이언트 유형 | SQL Server 2005 형식 | SQL Server 2008(또는 이후 버전) 형식 | 결과 변환(서버에서 클라이언트로) | 매개 변수 변환(클라이언트에서 서버로) |
---|---|---|---|---|
DBTYPE_DBDATE | DateTime | 날짜 | 확인 | 확인 |
DBTYPE_DBTIMESTAMP | 시간 필드가 0으로 설정됩니다. | 시간 필드가 0이 아닌 경우 문자열 잘림으로 인해 IRowsetChange가 실패합니다. | ||
DBTYPE_DBTIME | Time(0) | 확인 | 확인 | |
DBTYPE_DBTIMESTAMP | 날짜 필드가 현재 날짜로 설정됩니다. | 소수 자릿수 초가 0이 아닌 경우 문자열 잘림으로 인해 IRowsetChange가 실패합니다. 날짜는 무시됩니다. |
||
DBTYPE_DBTIME | Time(7) | 실패 - 잘못된 시간 리터럴입니다. | OK | |
DBTYPE_DBTIMESTAMP | 실패 - 잘못된 시간 리터럴입니다. | OK | ||
DBTYPE_DBTIMESTAMP | Datetime2(3) | 확인 | 확인 | |
DBTYPE_DBTIMESTAMP | Datetime2(7) | 확인 | 확인 | |
DBTYPE_DBDATE | Smalldatetime | 날짜 | 확인 | 확인 |
DBTYPE_DBTIMESTAMP | 시간 필드가 0으로 설정됩니다. | 시간 필드가 0이 아닌 경우 문자열 잘림으로 인해 IRowsetChange가 실패합니다. | ||
DBTYPE_DBTIME | Time(0) | 확인 | 확인 | |
DBTYPE_DBTIMESTAMP | 날짜 필드가 현재 날짜로 설정됩니다. | 소수 자릿수 초가 0이 아닌 경우 문자열 잘림으로 인해 IRowsetChange가 실패합니다. 날짜는 무시됩니다. |
||
DBTYPE_DBTIMESTAMP | Datetime2(0) | 확인 | 확인 |
OK는 SQL Server 2005(9.x)에서 작동하는 경우 SQL Server 2008(10.0.x) 이상에서 계속 작동해야 한다는 것을 의미합니다.
다음과 같은 일반적인 스키마 변경 내용만 고려되었습니다.
논리적으로 애플리케이션에 날짜 또는 시간 값만 필요한 새 형식을 사용합니다. 그러나 별도의 날짜 및 시간 형식을 사용할 수 없으므로 애플리케이션에서 datetime 또는 smalldatetime을 사용해야 했습니다.
새 형식을 사용하여 추가 소수 자릿수 초 정밀도 또는 정확도를 얻습니다.
날짜 및 시간에 대한 기본 설정 데이터 형식이므로 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(10.0.x) 이전 버전의 SQL Server Native Client로 컴파일된 클라이언트의 매개 변수, 결과 열 및 스키마 행 집합에 대한 메타데이터를 설명합니다.
ICommandWithParameters::GetParameterInfo
DBPARAMINFO 구조체는 prgParamInfo 매개 변수를 통해 다음 정보를 반환합니다.
매개 변수 형식 | wType | ulParamSize | bPrecision | bScale |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | ~0 | ~0 |
시간 | 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 |
시간 | 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 2008(10.0.x) SQL Server Native Client 이전 도구를 사용하여 개발된 클라이언트 공급자가 있다는 것입니다.
COLUMNS 행 집합
날짜/시간 형식에 대해 다음 열 값이 반환됩니다.
열 유형 | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | DATETIME_PRECISION |
---|---|---|---|---|
date | DBTYPE_WSTR | 10 | 20 | NULL |
시간 | 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(10.0.x)보다 이전 버전의 서버에 연결된 경우 새 서버 유형 이름(예: ICommandWithParameters::SetParameterInfo 또는 ITableDefinition::CreateTable 사용)을 사용하려고 하면 DB_E_BADTYPENAME 발생합니다.
새 형식이 형식 이름을 사용하지 않고 매개 변수 또는 결과에 바인딩되고, 새 형식을 사용하여 서버 유형을 암시적으로 지정하거나 서버 유형에서 클라이언트 유형으로의 유효한 변환이 없는 경우 DB_E_ERRORSOCCURRED가 반환되고 DBBINDSTATUS_UNSUPPORTED_CONVERSION이 Execute에 사용된 접근자에 대한 바인딩 상태로 설정됩니다.
버퍼 형식에서 연결의 서버 버전에 대한 서버 형식으로 지원되는 클라이언트 변환이 있는 경우 모든 클라이언트 버퍼 형식을 사용할 수 있습니다. 이 컨텍스트 에서 서버 형식 은 ICommandWithParameters::SetParameterInfo로 지정된 형식을 의미하거나 ICommandWithParameters::SetParameterInfo가 호출되지 않은 경우 버퍼 형식에 의해 암시됩니다. 즉, DBTYPE_DBTIME2 및 DBTYPE_DBTIMESTAMPOFFSET 하위 수준 서버에서 사용하거나 DataTypeCompatibility=80이면 지원되는 서버 유형으로의 클라이언트 변환에 성공할 수 있습니다. 물론 서버 형식이 올바르지 않으면 실제 서버 형식으로 암시적 변환을 수행할 수 없는 경우에도 서버에서 오류를 보고할 수 있습니다.
SSPROP_INIT_DATATYPECOMPATIBILITY 동작
SSPROP_INIT_DATATYPECOMPATIBILITY SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000 설정하면 고급 날짜 및 시간 형식(OLE DB 및 ODBC)에 대한 대량 복사 변경 내용에 설명된 대로 새 날짜/시간 형식 및 관련 메타데이터가 하위 수준 클라이언트에 대해 표시될 때 클라이언트에 표시됩니다.
IRowsetFind 비교
새 날짜/시간 형식은 날짜/시간 형식이 아니라 문자열 형식으로 표시되기 때문에 이러한 형식에 대해서는 모든 비교 연산자를 사용할 수 있습니다.