다음을 통해 공유


이전 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 비교

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

참고 항목

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