분산 쿼리에 데이터 형식 매핑
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 |
date, datetime, datetime2, datetimeoffset |
|
DBTYPE_DBDATE |
date, datetime, datetime2, datetimeoffset(호환성 수준이 9.0보다 작음) |
|
DBTYPE_DBTIME |
time, datetime, datetime2, datetimeoffset |
|
DBTYPE_DBTIME_EX |
time, datetime2, datetimeoffset |
DBTYPE_DBTIMESTAMP |
time, date, datetime2, datetimeoffset, datetime |
|
---|---|---|
DBTYPE_DBTIMESTAMP |
time, date, datetime2, datetimeoffset |
|
DBTYPE_DBTIMESTAMP |
time, date, datetime2, datetimeoffset |
|
DBTYPE_ARRAY |
오류 |
|
DBTYPE_BYREF |
무시됨 |
|
DBTYPE_VECTOR |
오류 |
|
DBTYPE_RESERVED |
오류 |
|
DBTYPE_XML |
xml(통과 쿼리에서만 허용됨) |
1numeric(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로의 매핑이 데이터 형식 매핑 표에 정의되어 있습니다.
원격 서버로부터 수신한 일자 및 시간 일자에 대한 SQL Server 2008 매핑
다음 표에서는 OLE DB 데이터 원본에서 SQL Server 2008 인스턴스로 전송된 데이터에 대한 date 및 time 데이터 형식 매핑을 보여 줍니다. 이 변환은 SQL Server 2008이 SELECT 문이나 UPDATE, INSERT 또는 DELETE 문을 읽는 쪽에 있는 OLE DB 데이터 원본에서 데이터를 읽을 때만 발생합니다. 원격 열이 date, time, dateime2 또는 datetimeoffset 데이터 형식일 경우 데이터베이스 호환성 수준이 100 이상이면 해당 데이터 형식이 반환됩니다. 호환성 수준이 더 낮으면 SQL Server 2008에서는 datetime으로 암시적 변환을 수행합니다.
OLE DB 형식 |
원격 서버가 SQL Server 2008일 경우 반환 데이터 형식 |
원격 서버가 SQL Server 2005 또는 SQL Server 2000일 경우 반환 데이터 형식 |
원격 서버가 SQL Server가 아니고 로컬 SQL Server 2008 데이터베이스 호환성 수준이 90일 경우 반환 데이터 형식 |
원격 서버가 SQL Server가 아니고 로컬 SQL Server 2008 데이터베이스 호환성 수준이 100일 경우 반환 데이터 형식 |
---|---|---|---|---|
dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정되지 않은 DBTYPE_DBTIMESTAMP |
datetime(원격 열은 datetime 또는 smalldatetime이 될 수 있음) |
datetime(원격 열은 datetime 또는 smalldatetime이 될 수 있음) |
datetime |
datetime2(7) |
dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정된 DBTYPE_DBTIMESTAMP |
datetime2 |
해당 사항 없음 |
해당 사항 없음 |
해당 사항 없음 |
DBTYPE_DBDATE |
date |
해당 사항 없음 |
datetime |
date |
DBTYPE_DBTIME |
time(0) |
해당 사항 없음 |
datetime |
time(0) |
DBTYPE_DBTIME2 |
time(n) |
해당 사항 없음 |
해당 사항 없음 |
해당 사항 없음 |
DBTYPE_DBTIMESTAMPOFFSET |
datetimeoffset |
해당 사항 없음 |
해당 사항 없음 |
해당 사항 없음 |
원격 서버로 전송한 일자 및 시간 일자에 대한 SQL Server 2008 매핑
다음 표에서는 SQL Server 2008 인스턴스에서 OLE DB 데이터 대상으로 전송된 데이터에 대한 date 및 time 데이터 형식 매핑을 보여 줍니다. 이 변환은 SQL Server 2008이 대개 INSERT나 UPDATE 문의 데이터를 OLE DB 데이터 원본으로 쓸 때(수정된 테이블이 원격 테이블임) 발생합니다.
SQL Server 2008 데이터 형식 |
원격 서버가 SQL Server 2008일 경우 바인딩할 데이터 형식 |
원격 서버가 SQL Server 2005 또는 SQL Server 2000일 경우 바인딩할 데이터 형식 |
원격 서버가 SQL Server가 아닐 경우 바인딩할 형식 |
---|---|---|---|
datetime, smalldatetime |
dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정되지 않은 DBTYPE_DBTIMESTAMP |
dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정되지 않은 DBTYPE_DBTIMESTAMP |
dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정되지 않은 DBTYPE_DBTIMESTAMP |
datetime2(n) |
dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정된 DBTYPE_DBTIMESTAMP |
dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정되지 않은 DBTYPE_DBTIMESTAMP |
dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정되지 않은 DBTYPE_DBTIMESTAMP |
date |
DBTYPE_DBDATE |
DBTYPE_DBDATE |
DBTYPE_DBDATE |
time(0) |
DBTYPE_DBTIME |
DBTYPE_DBTIME |
DBTYPE_DBTIME |
time(n)(0 < n <= 7) |
DBTYPE_DBTIMESTAMP(보류 데이터 부분 포함) dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정되어 있음 |
dwFlags가 DBPARAMFLAGS_SS_ISVARIABLESCALE로 설정되지 않은 DBTYPE_DBTIMESTAMP |
DBTYPE_DBTIMESTAMP(보류 데이터 부분 포함) |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
해당 사항 없음 |
해당 사항 없음 |
일자 및 시간 데이터 형식을 사용하여 SQL Server 2008 원격 쿼리 실행
SQL Server 2008에서는 로컬 또는 원격 서버에 time, date, datetime2 또는 datetimoffset 데이터 형식을 사용하는 원격 개체를 참조하는 쿼리를 실행합니다. 원격 서버 및 참조 유형의 버전이나 공급자에 따라 결정이 달라집니다. 검토한 참조 유형은 원격 열 또는 상수, 변수 또는 로컬 열입니다.
SQL Server 이외 공급자
SQL Server 이외 공급자의 원격 서버에 비슷한 형식이 존재할 경우 time, date 및 datetime2 데이터 형식에 대해 부분적으로 지원됩니다. 이러한 공급자에게는 해당 형식에 대한 지원을 선언하는 방법이 없습니다.
다음 표에서는 쿼리가 원격 서버에서 실행되는지 아니면 로컬 서버에서 실행되는지를 보여 줍니다. 첫 번째 열에서는 로컬 서버의 데이터 형식을 보여 줍니다. 두 번째 열에서는 SQL Server 2008의 로컬 인스턴스에서 원격 서버에 사용하는 해당 OLE DB 데이터 형식을 보여 줍니다. 마지막 세 열에서는 쿼리가 원격 서버에서 실행되는지 아니면 로컬 서버에서 실행되는지를 보여 줍니다. 실행 위치는 원격 서버의 버전이나 유형에 따라 다릅니다.
로컬 서버 데이터 형식 |
로컬 SQL Server 2008에서 사용되는 원격 서버 OLE DB 데이터 형식 |
SQL Server 2008 이상 버전의 원격 서버 |
SQL Server 2005 원격 서버 |
MSSQL 이외 원격 서버 |
---|---|---|---|---|
datetime |
DBTYPE_DBTIMESTAMP |
원격 |
원격 |
원격 |
smalldatetime |
DBTYPE_DBTIMESTAMP |
원격 |
원격 |
원격 |
datetime2 |
DBTYPE_DBTIMESTAMP |
원격 |
로컬 |
원격 |
datetimeoffset |
DBTYPE_DBTIMESTAMPOFFSET |
원격 |
로컬 |
로컬 |
date |
DBTYPE_DBDATE |
원격 |
로컬 |
원격 |
time(>0) |
DBTYPE_DBTIME2 |
원격 |
로컬 |
로컬 |
time(0) |
DBTYPE_DBTIME2 |
원격 |
로컬 |
원격 |