분산 쿼리에 데이터 형식 매핑
OLE DB 공급자는 데이터의 데이터 형식을 DBTYPE이라고 하는 OLE DB 형식 식별자로 제공합니다. 데이터 형식은 데이터 매핑을 통해 OLE DB 데이터 형식과 SQL Server 시스템 데이터 형식으로 서로 변환됩니다.
- OLE DB 데이터 형식에서 SQL Server 시스템 데이터 형식으로 변환. 이 변환은 SQL Server 가 SELECT 문이나 UPDATE, INSERT 또는 DELETE문의 읽는 쪽에 있는 OLE DB 데이터 원본에서 데이터를 읽을 때만 발생합니다.
- SQL Server 시스템 데이터 형식에서 OLE DB 데이터 형식으로 변환. 이 변환은 SQL Server 가 대개 INSERT나 UPDATE 문의 데이터를 OLE DB 데이터 원본으로 쓸 때(수정된 테이블이 원격 테이블임) 발생합니다.
OLE DB 공급자에서 SQL Server로 데이터 형식 매핑
OLE DB 공급자에서 SQL Server로의 데이터 형식 매핑은 허용된 비교 및 식과 원격 데이터를 수반하는 유효한 명시적 변환을 정의합니다. 이러한 매핑은 이후에 표시되는 테이블에 표시됩니다.
식의 원격 테이블 열에 대한 형식 유효성은 데이터 형식 매핑 테이블에서 해당 매핑된 SQL Server 데이터 형식이 동일한 컨텍스트에서 유효할 경우에만 원격 열 값이 Transact-SQL 식에서 유효하다는 규칙으로 요약될 수 있습니다.
다음 식을 참조하십시오. local_columnOPERATOR remote_column. 이 식에서local_column은 로컬 테이블 열이고 remote_column은 원격 테이블 열입니다. 이 식은 OPERATOR가 로컬 열의 데이터 형식과 remote_column의 DBTYPE이 매핑되는 데이터 형식에 대해 유효한 연산자인 경우에만 유효합니다.
이와 비슷하게 remote_column의 DBTYPE이 SQL Server 시스템 데이터 형식 data_type_2에 매핑되고 data_type_2에서 data_type_1로의 명시적 변환이 허용되는 경우에 CAST(remote_column AS data_type_1)가 허용됩니다. 예를 들어 공급자 측의 DBTYPE_DATE 데이터 형식으로 된 열은 SQL Server 에서 datetime 열로 변환될 수 있습니다. 그렇지만 DBTYPE_DATE 데이터는 varchar로 바로 변환될 수 없습니다.
다음 표는 데이터 형식 매핑 표를 보여 줍니다. DBTYPE 표시와 열의 해당 DBCOLUMNFLAGS 값을 사용하여 해당 SQL Server 데이터 형식을 찾을 수 있습니다.
DBTYPE | DBCOLUMNFLAGS | SQL Server 데이터 형식 |
---|---|---|
DBTYPE_I1 |
numeric(3, 0)1 |
|
DBTYPE_I2 |
smallint |
|
DBTYPE_I4 |
int |
|
DBTYPE_I8 |
bigint |
|
DBTYPE_UI1 |
tinyint |
|
DBTYPE_UI1 |
numeric(5,0) |
|
DBTYPE_UI1 |
numeric(10,0) |
|
DBTYPE_UI1 |
numeric(20,0) |
|
DBTYPE_R4 |
float |
|
DBTYPE_R8 |
real |
|
DBTYPE_NUMERIC |
numeric |
|
DBTYPE_DECIMAL |
decimal |
|
DBTYPE_CY |
money |
|
DBTYPE_BSTR |
DBCOLUMNFLAGS_ISLONG = true |
ntext |
DBTYPE_BSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = true |
nchar |
DBTYPE_BSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
nvarchar |
DBTYPE_IDISPATCH |
오류 |
|
DBTYPE_ERROR |
오류 |
|
DBTYPE_BOOL |
bit |
|
DBTYPE_VARIANT |
nvarchar(4000) |
|
DBTYPE_IUNKNOWN |
오류 |
|
DBTYPE_GUID |
uniqueidentifier |
|
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISLONG = true 또는 최대 열 크기가 8,000바이트보다 큼 |
image |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISLONG = true이고 열 길이 제한 없음 |
varbinary(max) |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISROWVER = true, DBCOLUMNFLAGS_ISFIXEDLENGTH = true, 열 크기 = 8 |
timestamp |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISFIXEDLENGTH = true |
binary |
DBTYPE_BYTES |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
varbinary |
DBTYPE_STR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = true |
char |
DBTYPE_ STR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
varchar |
DBTYPE_STR |
DBCOLUMNFLAGS_ISLONG = true 또는 최대 열 크기가 8,000자보다 큼 |
text |
DBTYPE_STR |
DBCOLUMNFLAGS_ISLONG = true이고 열 길이 제한 없음 |
varchar(max) |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISFIXED |
nchar |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISFIXEDLENGTH = false |
nvarchar |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISLONG = true 또는 최대 열 크기가 4,000자보다 큼 |
ntext |
DBTYPE_WSTR |
DBCOLUMNFLAGS_ISLONG = true이고 열 길이 제한 없음 |
nvarchar(max) |
DBTYPE_UDT |
등록된 형식이 있는 경우 SQL Server 사용자 정의 형식과 동일함 |
|
DBTYPE_DATE |
datetime |
|
DBTYPE_DBDATE |
datetime(호환성 수준이 9.0보다 작음) |
|
DBTYPE_DBTIME |
datetime |
|
DBTYPE_DBTIMESTAMP |
datetime |
|
DBTYPE_ARRAY |
오류 |
|
DBTYPE_BYREF |
무시됨 |
|
DBTYPE_VECTOR |
오류 |
|
DBTYPE_RESERVED |
오류 |
|
DBTYPE_XML |
xml(통과 쿼리에서만 허용됨) |
1**numeric(p,s)**는 전체 자릿수 p 및 소수 자릿수 s의 SQL Server 데이터 형식 numeric을 나타냅니다.
[!참고] 데이터를 표시된 기본값과는 다른 SQL Server 데이터 형식으로 변환해야 하는 경우 CAST 또는 CONVERT 함수를 사용한 명시적 변환이 필요합니다. 자세한 내용은 CAST 및 CONVERT(Transact-SQL)를 참조하십시오.
DBTYPE 표시와 DBCOLUMNFLAGS 값 정보는 COLUMNS 스키마 행 집합 또는 IColumnsInfo 인터페이스를 통해 공급자로부터 제공됩니다. COLUMNS 스키마 행 집합의 경우 DATA_TYPE 및 COLUMN_FLAGS 열은 DBTYPE 및 DBCOLUMNFLAGS 값을 나타냅니다. IColumnsInfo::GetColumnInfo 인터페이스의 경우 DBCOLUMNINFO 구조의 wType 및 dwFlags 멤버는 이러한 값을 나타냅니다.
SQL Server에서 OLE DB 공급자로의 데이터 형식 매핑
SQL Server 시스템 데이터 형식은 위 표에 표시된 매핑을 사용하여 OLE DB 형식으로 매핑됩니다. SQL Server 형식 S1에서 특정 OLE DB 형식 T로의 매핑은 다음 두 조건 중 하나가 충족될 경우에만 허용됩니다.
- 데이터 형식 매핑 표에서 해당 매핑을 찾을 수 있습니다.
- 데이터 형식 S1에서 다른 SQL Server 데이터 형식 S2로의 암시적 변환이 허용되고 S2에서 T로의 매핑이 데이터 형식 매핑 표에 정의되어 있습니다.