큰 CLR 사용자 정의 형식(OLE DB)
적용 대상: SQL Server Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System(PDW)
이 항목에서는 큰 CLR(공용 언어 런타임) UDT(사용자 정의 형식)를 지원하기 위한 SQL Server용 OLE DB 드라이버의 OLE DB 변경 내용에 대해 설명합니다.
OLE DB Driver for SQL Server의 큰 CLR UDT 지원에 대한 자세한 정보는 큰 CLR 사용자 정의 형식을 참조하세요. 샘플은 큰 CLR UDT 사용(OLE DB)을 참조하세요.
데이터 형식
SQL Server용 OLE DB 드라이버는 ~0을 사용하여 LOB(Large Object) 형식에 대해 무제한 크기인 값의 길이를 나타냅니다. ~0은 8,000바이트보다 큰 CLR UDT 크기도 나타냅니다.
다음 표에서는 매개 변수 및 행 집합의 데이터 형식 매핑을 보여 줍니다.
SQL Server 데이터 형식 | OLE DB 데이터 형식 | 메모리 레이아웃 | 값 |
---|---|---|---|
CLR UDT | DBTYPE_UDT | BYTE[](바이트 배열) | 132(oledb.h) |
UDT 값은 바이트 배열로 나타납니다. 16진수 문자열로의 변환 및 그 반대의 변환이 지원됩니다. 리터럴 값은 접두사 "0x"를 사용하여 16진수 문자열로 나타납니다. 16진수 문자열은 밑수가 16인 이진 데이터의 텍스트 표현입니다. 예를 들어 서버 형식 varbinary(10) 를 DBTYPE_STR로 변환하는 경우 모든 문자 쌍이 단일 바이트를 나타내는 20자의 16진수 표현이 생성됩니다.
매개 변수 속성
DBPROPSET_SQLSERVERPARAMETER 속성 집합은 OLE DB를 통해 UDT를 지원합니다. 자세한 내용은 사용자 정의 형식 사용을 참조하세요.
열 속성
DBPROPSET_SQLSERVERCOLUMN 속성 집합은 OLE DB를 통해 테이블 만들기를 지원합니다. 자세한 내용은 사용자 정의 형식 사용을 참조하세요.
ITableDefinition::CreateTable의 데이터 형식 매핑
UDT 열이 필요한 경우 ITableDefinition::CreateTable에서 DBCOLUMNDESC 구조에 사용하는 정보는 다음과 같습니다.
OLE DB 데이터 형식(wType) | pwszTypeName | SQL Server 데이터 형식 | rgPropertySets |
---|---|---|---|
DBTYPE_UDT | 무시됨 | UDT | DBPROPSET_SQLSERVERCOLUMN 속성 집합을 포함해야 합니다. |
ICommandWithParameters::GetParameterInfo
prgParamInfo를 통해 DBPARAMINFO 구조에 반환된 정보는 다음과 같습니다.
매개 변수 형식 | wType | ulParamSize | bPrecision | bScale | dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (8,000바이트 이하 길이) |
"DBTYPE_UDT" | n | 정의되지 않음 | 정의되지 않음 | 지우기 |
DBTYPE_UDT (8,000바이트를 초과하는 길이) |
"DBTYPE_UDT" | ~0 | 정의되지 않음 | 정의되지 않음 | set |
ICommandWithParameters::SetParameterInfo
DBPARAMBINDINFO 구조에 제공된 정보는 다음을 준수해야 합니다.
매개 변수 형식 | pwszDataSourceType | ulParamSize | bPrecision | bScale | dwFlags DBPARAMFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (8,000바이트 이하 길이) |
DBTYPE_UDT | n | 무시됨 | 무시됨 | DBTYPE_IUNKNOWN을 사용하여 매개 변수가 전달되는 경우 설정해야 합니다. |
DBTYPE_UDT (8,000바이트를 초과하는 길이) |
DBTYPE_UDT | ~0 | 무시됨 | 무시됨 | 무시됨 |
ISSCommandWithParameters
애플리케이션에서 ISSCommandWithParameters를 사용하여 매개 변수 속성 섹션에서 정의된 매개 변수 속성을 가져오고 설정합니다.
IColumnsRowset::GetColumnsRowset
반환되는 열은 다음과 같습니다.
열 유형 | DBCOLUMN_TYPE | DBCOLUMN_COLUMNSIZE | DBCOLUMN_PRECISION | DBCOLUMN_SCALE | DBCOLUMN_FLAGS_ISLONG | DBCOLUMNS_ISSEARCHABLE | DBCOLUMN_OCTETLENGTH |
---|---|---|---|---|---|---|---|
DBTYPE_UDT (8,000바이트 이하 길이) |
DBTYPE_UDT | n | NULL | NULL | 지우기 | DB_ALL_EXCEPT_LIKE | n |
DBTYPE_UDT (8,000바이트를 초과하는 길이) |
DBTYPE_UDT | ~0 | NULL | NULL | 설정 | DB_ALL_EXCEPT_LIKE | 0 |
UDT에 대해 다음 열도 정의됩니다.
열 식별자 | Type | Description |
---|---|---|
DBCOLUMN_UDT_CATALOGNAME | DBTYPE_WSTR | UDT 열의 경우 UDT가 정의된 카탈로그의 이름입니다. |
DBCOLUMN_UDT_SCHEMANAME | DBTYPE_WSTR | UDT 열의 경우 UDT가 정의된 스키마의 이름입니다. |
DBCOLUMN_UDT_NAME | DBTYPE_WSTR | UDT 열의 경우 UDT의 단일 부분 이름입니다. |
DBCOLUMN_ASSEMBLY_TYPENAME | DBTYPE_WSTR | UDT 열의 경우 UDT의 전체 유형 이름입니다. 어셈블리 유형의 정규화된 이름을 사용하면 Type.GetType 메서드를 사용하여 해당 유형의 개체를 인스턴스화할 수 있습니다. |
IColumnsInfo::GetColumnInfo
DBCOLUMNINFO 구조에 반환되는 정보는 다음과 같습니다.
매개 변수 형식 | wType | ulColumnSize | bPrecision | bScale | dwFlags DBCOLUMNFLAGS_ISLONG |
---|---|---|---|---|---|
DBTYPE_UDT (8,000바이트 이하 길이) |
DBTYPE_UDT | n | ~0 | ~0 | 지우기 |
DBTYPE_UDT (8,000바이트를 초과하는 길이) |
DBTYPE_UDT | ~0 | ~0 | ~0 | 설정 |
COLUMNS 행 집합(스키마 행 집합)
UDT 유형에 대해 다음 열 값이 반환됩니다.
열 유형 | DATA_TYPE | COLUMN_FLAGS, DBCOLUMFLAGS_ISLONG | CHARACTER_OCTET_LENGTH |
---|---|---|---|
DBTYPE_UDT (8,000바이트 이하 길이) |
DBTYPE_UDT | 지우기 | n |
DBTYPE_UDT (8,000바이트를 초과하는 길이) |
DBTYPE_UDT | 설정 | 0 |
UDT에 대해 다음 추가 열이 정의됩니다.
열 식별자 | Type | Description |
---|---|---|
SS_UDT_CATALOGNAME | DBTYPE_WSTR | UDT 열의 경우 UDT가 정의된 카탈로그의 이름입니다. |
SS_UDT_SCHEMANAME | DBTYPE_WSTR | UDT 열의 경우 UDT가 정의된 스키마의 이름입니다. |
SS_UDT_NAME | DBTYPE_WSTR | UDT 열의 경우 UDT의 단일 부분 이름입니다. |
SS_ASSEMBLY_TYPENAME | DBTYPE_WSTR | UDT 열의 경우 UDT의 전체 유형 이름입니다. 어셈블리 유형의 정규화된 이름을 사용하면 Type.GetType 메서드를 사용하여 해당 유형의 개체를 인스턴스화할 수 있습니다. |
PROCEDURE_PARAMETERS 행 집합과 관련해서 DATA_TYPE에는 COLUMNS 스키마 행 집합과 동일한 값이 포함되고 TYPE_NAME에는 UDT가 포함됩니다. 동일한 추가 열도 정의됩니다.
PROVIDER_TYPES 스키마 행 집합에는 사용자 정의 형식이 나타나지 않습니다.
바인딩 및 변환
바인딩 데이터 형식 | UDT에서 서버로 | 비 UDT에서 서버로 | 서버에서 UDT로 | 서버에서 비 UDT로 |
---|---|---|---|---|
DBTYPE_UDT | 지원됨 (5) | 오류 (1) | 지원됨 (5) | 오류 (4) |
DBTYPE_BYTES | 지원됨 (5) | 해당 없음 | 지원됨 (5) | 해당 없음 |
DBTYPE_WSTR | 지원됨 (2), (5) | 해당 없음 | 지원됨 (3), (5), (6) | 해당 없음 |
DBTYPE_BSTR | 지원됨 (2), (5) | 해당 없음 | 지원됨 (3), (5) | 해당 없음 |
DBTYPE_STR | 지원됨 (2), (5) | 해당 없음 | 지원됨 (3), (5) | 해당 없음 |
DBTYPE_IUNKNOWN | 지원됨 (6) | 해당 없음 | 지원됨 (6) | 해당 없음 |
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) | 지원됨 (5) | 해당 없음 | 지원됨 (3), (5) | 해당 없음 |
DBTYPE_VARIANT (VT_BSTR) | 지원됨 (2), (5) | 해당 없음 | 해당 없음 | 해당 없음 |
기호 설명
기호 | 의미 |
---|---|
1 | DBTYPE_UDT와는 다른 서버 유형이 ICommandWithParameters::SetParameterInfo를 사용하여 지정되고 접근자 유형이 DBTYPE_UDT인 경우 문을 실행하면 오류가 발생합니다. 오류는 DB_E_ERRORSOCCURRED이고 매개 변수 상태는 DBSTATUS_E_BADACCESSOR가 됩니다. UDT가 아닌 서버 매개 변수에 대해 UDT 유형의 매개 변수를 지정하는 것은 오류입니다. |
2 | 데이터가 16진수 문자열에서 이진 데이터로 변환됩니다. |
3 | 데이터가 이진 데이터에서 16진수 문자열로 변환됩니다. |
4 | CreateAccessor 또는 GetNextRows를 사용할 때 유효성 검사가 수행될 수 있습니다. 오류는 DB_E_ERRORSOCCURRED이고 바인딩 상태는 DBBINDSTATUS_UNSUPPORTEDCONVERSION으로 설정됩니다. |
5 | BY_REF가 사용될 수 있습니다. |
6 | UDT 매개 변수를 DBBINDING의 DBTYPE_IUNKNOWN으로 바인딩할 수 있습니다. DBTYPE_IUNKNOWN으로 바인딩할 경우 애플리케이션이 ISequentialStream 인터페이스를 사용하여 데이터를 스트림으로 처리하려는 것을 나타냅니다. 소비자가 바인딩의 wType을 DBTYPE_IUNKNOWN 형식으로 지정하고 저장된 프로시저의 해당 열 또는 출력 매개 변수가 UDT이면 OLE DB Driver for SQL Server에서 ISequentialStream을 반환합니다. 입력 매개 변수의 경우 OLE DB Driver for SQL Server에서는 ISequentialStream 인터페이스를 쿼리합니다. 큰 UDT의 경우 DBTYPE_IUNKNOWN 바인딩을 사용하는 동안 UDT 데이터의 길이를 바인딩하지 않도록 선택할 수 있습니다. 하지만 작은 UDT의 경우에는 길이를 바인딩해야 합니다. 다음 중 하나 이상이 True이면 DBTYPE_UDT 매개 변수를 큰 UDT로 지정할 수 있습니다. ulParamParamSize는 ~0입니다. DBPARAMBINDINFO 구조체에 DBPARAMFLAGS_ISLONG이 설정되어 있습니다. 행 데이터의 경우 DBTYPE_IUNKNOWN 바인딩만 큰 UDT에 사용할 수 있습니다. Rowset 또는 Command 개체의 IColumnsInfo 인터페이스에서 IColumnsInfo::GetColumnInfo 메서드를 사용하여 열이 큰 UDT 형식인지 확인할 수 있습니다. 다음 중 하나 이상이 True이면 DBTYPE_UDT 열은 큰 UDT 열입니다. DBCOLUMNFLAGS_ISLONG 플래그가 DBCOLUMNINFO 구조의 dwFlags 멤버에 설정되어 있습니다. DBCOLUMNINFO의 ulColumnSize 구성원은 ~0입니다. |
DBTYPE_NULL 및 DBTYPE_EMPTY는 입력 매개 변수에 대해서는 바인딩할 수 있지만 출력 매개 변수나 결과에 대해서는 바인딩할 수 없습니다. 입력 매개 변수에 대해 바인딩할 경우 DBTYPE_NULL을 나타내는 DBSTATUS_S_ISNULL 또는 DBTYPE_EMPTY를 나타내는 DBSTATUS_S_DEFAULT로 상태를 설정해야 합니다. DBTYPE_BYREF는 DBTYPE_NULL 또는 DBTYPE_EMPTY에 사용할 수 없습니다.
DBTYPE_UDT를 DBTYPE_EMPTY 및 DBTYPE_NULL로 변환할 수도 있습니다. 하지만 DBTYPE_NULL 및 DBTYPE_EMPTY를 DBTYPE_UDT로 변환할 수는 없습니다. 이는 DBTYPE_BYTES와 일치합니다. ISSCommandWithParameters는 UDT를 매개 변수로 처리하는 데 사용됩니다.
OLE DB 핵심 서비스(IDataConvert)에서 제공하는 데이터 변환은 DBTYPE_UDT에는 적용되지 않습니다.
다른 바인딩은 지원되지 않습니다.
IRowsetFind 비교
UDT 유형의 경우 다음과 같은 비교만 지원됩니다.
EQ
NE
IGNORE
다른 비교를 시도하면 DB_E_BADCOMPAREOP가 반환됩니다.
UDT에 대한 BCP 지원
UDT 값은 문자나 이진 값으로만 가져오고 내보낼 수 있습니다.
UDT에 대한 하위 수준 클라이언트 동작
UDT에 적용되는 하위 수준 클라이언트와의 유형 매핑은 다음과 같습니다.
클라이언트 버전 | DBTYPE_UDT (8,000바이트 이하 길이) |
DBTYPE_UDT (8,000바이트를 초과하는 길이) |
---|---|---|
SQL Server 2005 | UDT | varbinary(max) |
SQL Server 2008 이상 | UDT | UDT |
DataTypeCompatibility(SSPROP_INIT_DATATYPECOMPATIBILITY)를 "80"으로 설정하면 큰 UDT 유형이 하위 수준 클라이언트에 대해 표시되는 것과 동일한 방식으로 클라이언트에 표시됩니다.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기