다음을 통해 공유


이전 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 날짜와 시간 날짜 그래 그래
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 날짜 그래 그래
DBTYPE_DBTIMESTAMP 시간 필드가 0으로 설정됩니다. 시간 필드가 0이 아닌 경우 문자열 잘림으로 인해 IRowsetChange가 실패합니다.
DBTYPE_DBTIME Time(0) 그래 그래
DBTYPE_DBTIMESTAMP 날짜 필드가 현재 날짜로 설정됩니다. 소수 자릿수 초가 0이 아닌 경우 문자열 잘림으로 인해 IRowsetChange가 실패합니다.

날짜는 무시됩니다.
DBTYPE_DBTIMESTAMP Datetime2(0) 그래 그래

OK는 SQL Server 2005에서 작동하는 경우 SQL Server 2008 이상에서 계속 작동해야 임을 의미합니다.

다음과 같은 일반적인 스키마 변경 내용만 고려되었습니다.

  • 논리적으로 애플리케이션에 날짜 또는 시간 값만 필요한 새 형식을 사용합니다. 그러나 애플리케이션을 강제로 사용 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 이전 버전의 SQL Server Native Client로 컴파일된 클라이언트의 매개 변수, 결과 열 및 스키마 행 집합에 대한 메타데이터를 설명합니다.

ICommandWithParameters::GetParameterInfo

DBPARAMINFO 구조체는 prgParamInfo 매개 변수를 통해 다음 정보를 반환합니다.

매개 변수 형식 wType ulParamSize bPrecision bScale
날짜 DBTYPE_WSTR 10 ~0 ~0
시간 DBTYPE_WSTR 8, 10..16 ~0 ~0
스몰데이트타임 DBTYPE_DBTIMESTAMP 16 16 0
날짜 및 시간 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
날짜 DBTYPE_WSTR 10 없음 없음
시간 DBTYPE_WSTR 8, 10..16 없음 없음
스몰데이트타임 DBTYPE_DBTIMESTAMP 16 16 0
날짜 및 시간 DBTYPE_DBTIMESTAMP 16 23 3
datetime2은(는) 데이터베이스 날짜 및 시간 형식의 데이터 타입입니다. DBTYPE_WSTR 19,21..27 없음 없음
DateTimeOffset (날짜 및 시간 오프셋) DBTYPE_WSTR 26,28..34 없음 없음

ColumnsInfo::GetColumnInfo

DBCOLUMNINFO 구조체는 다음 정보를 반환합니다.

매개 변수 형식 wType ulColumnSize bPrecision bScale
날짜 DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
스몰데이트타임 DBTYPE_DBTIMESTAMP 16 16 0
날짜 및 시간 DBTYPE_DBTIMESTAMP 16 23 3
datetime2은(는) 데이터베이스 날짜 및 시간 형식의 데이터 타입입니다. DBTYPE_WSTR 19,21..27 ~0 ~0
DateTimeOffset (날짜 및 시간 오프셋) DBTYPE_WSTR 26,28..34 ~0 ~0

스키마 행 집합

이 섹션에서는 새 데이터 형식의 매개 변수, 결과 열 및 스키마 행 집합에 대한 메타데이터에 대해 설명합니다. 이 정보는 SQL Server 2008 SQL Server Native Client 이전의 도구를 사용하여 개발된 클라이언트 공급자가 있다는 것입니다.

COLUMNS 행 집합

날짜/시간 형식에 대해 다음 열 값이 반환됩니다.

열 형식 데이터 유형 CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
날짜 DBTYPE_WSTR 10 20 없음
시간 DBTYPE_WSTR 8, 10..16 16,20..32 없음
스몰데이트타임 DBTYPE_DBTIMESTAMP 없음 없음 0
날짜 및 시간 DBTYPE_DBTIMESTAMP 없음 없음 3
datetime2은(는) 데이터베이스 날짜 및 시간 형식의 데이터 타입입니다. DBTYPE_WSTR 19,21..27 38,42..54 없음
DateTimeOffset (날짜 및 시간 오프셋) DBTYPE_WSTR 26,28..34 52, 56..68 없음

PROCEDURE_PARAMETERS 행 집합

날짜/시간 형식에 대해 다음 열 값이 반환됩니다.

열 형식 데이터 유형 CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH 타입_이름

LOCAL_TYPE_NAME
날짜 DBTYPE_WSTR 10 20 날짜
시간 DBTYPE_WSTR 8, 10..16 16,20..32 시간
스몰데이트타임 DBTYPE_DBTIMESTAMP 없음 없음 스몰데이트타임
날짜 및 시간 DBTYPE_DBTIMESTAMP 없음 없음 날짜 및 시간
datetime2은(는) 데이터베이스 날짜 및 시간 형식의 데이터 타입입니다. DBTYPE_WSTR 19,21..27 38,42..54 datetime2은(는) 데이터베이스 날짜 및 시간 형식의 데이터 타입입니다.
DateTimeOffset (날짜 및 시간 오프셋) DBTYPE_WSTR 26,28..34 52, 56..68 DateTimeOffset (날짜 및 시간 오프셋)

PROVIDER_TYPES 행 집합

날짜/시간 형식에 대해 다음 행이 반환됩니다.

받는 사람 ->

칼럼
날짜 시간 스몰데이트타임 날짜 및 시간 datetime2은(는) 데이터베이스 날짜 및 시간 형식의 데이터 타입입니다. DateTimeOffset (날짜 및 시간 오프셋)
타입_이름 날짜 시간 스몰데이트타임 날짜 및 시간 datetime2은(는) 데이터베이스 날짜 및 시간 형식의 데이터 타입입니다. DateTimeOffset (날짜 및 시간 오프셋)
데이터 유형 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 없음 없음 없음 없음 없음 없음
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
검색 DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE 없음 없음 없음 없음 없음 없음
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 날짜 시간 스몰데이트타임 날짜 및 시간 datetime2은(는) 데이터베이스 날짜 및 시간 형식의 데이터 타입입니다. DateTimeOffset (날짜 및 시간 오프셋)
MINIMUM_SCALE 없음 없음 없음 없음 없음 없음
MAXIMUM_SCALE 없음 없음 없음 없음 없음 없음
GUID 없음 없음 없음 없음 없음 없음
TYPELIB 없음 없음 없음 없음 없음 없음
버전 없음 없음 없음 없음 없음 없음
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가 호출되지 않은 경우 버퍼 형식에 의해 암시됩니다. 즉, DBTYPE_DBTIME2 및 DBTYPE_DBTIMESTAMPOFFSET 하위 수준 서버에서 사용하거나 DataTypeCompatibility=80이면 지원되는 서버 유형으로의 클라이언트 변환에 성공할 수 있습니다. 물론 서버 형식이 올바르지 않으면 실제 서버 형식으로 암시적 변환을 수행할 수 없는 경우에도 서버에서 오류를 보고할 수 있습니다.

SSPROP_INIT_DATATYPECOMPATIBILITY 동작

SSPROP_INIT_DATATYPECOMPATIBILITY SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000 설정하면 고급 날짜 및 시간 형식(OLE DB 및 ODBC)에 대한 대량 복사 변경 내용에 설명된 대로 새 날짜/시간 형식 및 관련 메타데이터가 하위 수준 클라이언트에 대해 표시될 때 클라이언트에 표시됩니다.

IRowsetFind에 대한 비교 가능성

새 날짜/시간 형식은 날짜/시간 형식이 아니라 문자열 형식으로 표시되기 때문에 이러한 형식에 대해서는 모든 비교 연산자를 사용할 수 있습니다.

또한 참조하십시오

날짜 및 시간 기능 향상(OLE DB)