SQL Server Native Clients에서 XML 데이터 형식 사용

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System(PDW)

Important

SQL Server Native Client(약칭 SNAC)는 SQL Server 2022(16.x) 및 SSMS(SQL Server Management Studio) 19에서 제거되었습니다. SQL Server Native Client(SQLNCLI 또는 SQLNCLI11) 및 레거시 Microsoft OLE DB Provider for SQL Server(SQLOLEDB)는 새 애플리케이션 개발에 권장되지 않습니다. 앞으로 새 SQL Server용 Microsoft OLE DB 드라이버(MSOLEDBSQL) 또는 최신 Microsoft ODBC Driver for SQL Server로 전환합니다. SQL Server 데이터베이스 엔진(버전 2012~2019)의 구성 요소로 제공되는 SQLNCLI의 경우 이 지원 수명 주기 예외를 참조하세요.

SQL Server 2005(9.x)에는 SQL Server 데이터베이스에 XML 문서 및 조각을 저장할 수 있는 xml 데이터 형식이 도입되었습니다. xml 데이터 형식은 SQL Server의 기본 제공 데이터 형식이며 int 및 varchar와 같은 다른 기본 제공 형식과 비슷한 방식으로 사용됩니다. 다른 기본 제공 형식과 마찬가지로 테이블을 만들 때 xml 데이터 형식을 열 형식으로, 변수 형식, 매개 변수 형식 또는 함수 반환 형식으로 사용하거나 CAST 및 CONVERT 함수에서 사용할 수 있습니다.

프로그래밍 고려 사항

XML은 문서의 인코딩을 지정하는 XML 헤더를 선택적으로 포함할 수 있다는 점을 자체적으로 설명할 수 있습니다. 예를 들면 다음과 같습니다.

<?xml version="1.0" encoding="windows-1252"?><doc/>

XML 표준은 문서의 처음 몇 바이트를 검사하여 XML 프로세서가 문서에 사용되는 인코딩을 검색하는 방법을 설명합니다. 애플리케이션에서 지정한 인코딩이 문서에 지정된 인코딩과 충돌하는 경우가 있을 수 있습니다. 바인딩된 매개 변수로 전달된 문서의 경우 XML은 SQL Server에서 이진 데이터로 처리되므로 변환이 이루어지지 않으며 XML 파서는 문제 없이 문서 내에 지정된 인코딩을 사용할 수 있습니다. 그러나 WSTR로 바인딩된 XML 데이터의 경우 애플리케이션은 문서가 유니코드로 인코딩되었는지 확인해야 합니다. 이 경우 문서를 DOM에 로드하고 인코딩을 유니코드로 변경하고 문서를 직렬화해야 할 수 있습니다. 이 작업을 수행하지 않으면 데이터 변환이 발생하여 XML이 잘못되거나 손상될 수 있습니다.

XML이 리터럴에 지정된 경우에도 충돌이 발생할 수 있습니다. 예를 들어 다음이 잘못되었습니다.

INSERT INTO xmltable(xmlcol) VALUES('<?xml version="1.0" encoding="UTF-16"?><doc/>')

INSERT INTO xmltable(xmlcol) VALUES(N'<?xml version="1.0" encoding="UTF-8"?><doc/>')

SQL Server Native Client OLE DB 공급자

DBTYPE_XML SQL Server Native Client OLE DB 공급자의 XML과 관련된 새 데이터 형식입니다. 또한 기존 OLE DB 유형의 DBTYPE_BYTES, DBTYPE_WSTR, DBTYPE_BSTR, DBTYPE_XML, DBTYPE_STR, DBTYPE_VARIANT 및 DBTYPE_IUNKNOWN 통해 XML 데이터에 액세스할 수 있습니다. XML 형식의 열에 저장된 데이터는 SQL Server Native Client OLE DB 공급자 행 집합의 열에서 다음 형식으로 검색할 수 있습니다.

  • 텍스트 문자열

  • ISequentialStream

참고 항목

SQL Server Native Client OLE DB 공급자는 SAX 판독기를 포함하지 않지만 ISequentialStream 을 MSXML의 SAX 및 DOM 개체에 쉽게 전달할 수 있습니다.

ISequentialStream 은 큰 XML 문서를 검색하는 데 사용해야 합니다. 다른 큰 값 형식에 사용되는 동일한 기술도 XML에 적용됩니다. 자세한 내용은 큰 값 형식 사용을 참조 하세요.

행 집합의 XML 형식 열에 저장된 데이터는 IRow::GetColumns, IRowChange::SetColumnsICommand::Execute 같은 일반 인터페이스를 통해 애플리케이션에 의해서도 검색, 삽입 또는 업데이트될 수 있습니다. 검색 사례와 마찬가지로 애플리케이션 프로그램은 텍스트 문자열 또는 ISequentialStream 을 SQL Server Native Client OLE DB 공급자에 전달할 수 있습니다.

참고 항목

문자열 형식의 XML 데이터를 ISequentialStream 인터페이스를 통해 보내려면 바인딩에서 DBTYPE_IUNKNOWN을 지정하고 해당 pObject 인수를 null로 설정하여 ISequentialStream을 가져와야 합니다.

소비자 버퍼가 너무 작아서 검색된 XML 데이터가 잘리면 길이가 0xffffffff 반환될 수 있습니다. 즉, 길이를 알 수 없습니다. 이는 실제 데이터보다 앞서 길이 정보를 보내지 않고 클라이언트로 스트리밍되는 데이터 형식으로서의 구현과 일치합니다. 경우에 따라 공급자가 IRowset::GetData와 같은 전체 값을 버퍼링하고 데이터 변환이 수행되는 경우 실제 길이가 반환될 수 있습니다.

SQL Server로 전송된 XML 데이터는 서버에서 이진 데이터로 처리됩니다. 이렇게 하면 변환이 발생하지 않으며 XML 파서가 XML 인코딩을 자동으로 검색할 수 있습니다. 이렇게 하면 더 넓은 범위의 XML 문서(예: UTF-8로 인코딩된 문서)를 SQL Server에 대한 입력으로 수락할 수 있습니다.

입력 XML이 DBTYPE_WSTR 바인딩된 경우 애플리케이션은 원치 않는 데이터 변환으로 인해 손상될 가능성을 방지하기 위해 이미 유니코드로 인코딩되었는지 확인해야 합니다.

데이터 바인딩 및 강제 변환

다음 표에서는 SQL Server xml 데이터 형식과 함께 나열된 데이터 형식을 사용할 때 발생하는 바인딩 및 강제 변환에 대해 설명합니다.

데이터 형식 To Server

XML
To Server

비 XML
서버에서

XML
서버에서

비 XML
DBTYPE_XML 6,7을 통과합니다. 오류1 OK11, 6 오류8
DBTYPE_BYTES 6,7을 통과합니다. N/A2 OK 11, 6 N/A 2
DBTYPE_WSTR 6,10을 통과합니다. N/A 2 OK4, 6, 12 N/A 2
DBTYPE_BSTR 6,10을 통과합니다. N/A 2 확인 3 N/A 2
DBTYPE_STR OK6, 9, 10 N/A 2 OK5, 6, 12 N/A 2
DBTYPE_IUNKNOWN ISequentialStream을 통한 바이트 스트림7 N/A 2 ISequentialStream11을 통한 바이트 스트림 N/A 2
DBTYPE_VARIANT(VT_UI1 | VT_ARRAY) 6,7을 통과합니다. N/A 2 해당 없음 N/A 2
DBTYPE_VARIANT (VT_BSTR) 6,10을 통과합니다. N/A 2 확인3 N/A 2

1DBTYPE_XML 이외의 서버 형식이 ICommandWithParameters::SetParameterInfo로 지정되고 접근자 형식이 DBTYPE_XML 경우 문이 실행될 때 오류가 발생합니다(DB_E_ERRORSOCCURRED 매개 변수 상태는 DBSTATUS_E_BADACCESSOR) 그렇지 않으면 데이터가 서버로 전송되지만 서버는 XML에서 매개 변수의 데이터 형식으로 암시적으로 변환되지 않음을 나타내는 오류를 반환합니다.

2이 항목의 범위를 벗어나봅니다.

3형식은 UTF-16, BOM(바이 순서 표시 없음), 인코딩 사양 없음, null 종료 없음입니다.

4형식은 UTF-16, BOM 없음, 인코딩 사양 없음, null 종료입니다.

5형식은 null 종결자를 사용하여 클라이언트 코드 페이지에서 인코딩된 멀티바이트 문자입니다. 서버 제공 유니코드에서 변환하면 데이터가 손상될 수 있으므로 이 바인딩은 권장되지 않습니다.

6BY_REF 사용할 수 있습니다.

7UTF-16 데이터는 BOM으로 시작해야 합니다. 그렇지 않으면 서버에서 인코딩을 올바르게 인식하지 못할 수 있습니다.

8유효성 검사는 만들기 접근자 시간 또는 인출 시 발생할 수 있습니다. 오류가 DB_E_ERRORSOCCURRED 바인딩 상태가 DBBINDSTATUS_UNSUPPORTEDCONVERSION 설정됩니다.

9데이터는 서버로 전송되기 전에 클라이언트 코드 페이지를 사용하여 유니코드로 변환됩니다. 문서 인코딩이 클라이언트 코드 페이지와 일치하지 않으면 데이터가 손상될 수 있으므로 이 바인딩은 권장되지 않습니다.

10BOM은 항상 서버로 전송되는 데이터에 추가됩니다. 데이터가 이미 BOM으로 시작된 경우 버퍼 시작 시 두 개의 BOM이 생성됩니다. 서버는 첫 번째 BOM을 사용하여 인코딩을 UTF-16으로 인식한 다음 삭제합니다. 두 번째 BOM은 너비가 0이 아닌 공백 문자로 해석됩니다.

11형식이 UTF-16이고 인코딩 사양을 포함하지 않으며 서버에서 받은 데이터에 BOM이 추가됩니다. 서버에서 빈 문자열을 반환하더라도 BOM이 애플리케이션에 반환됩니다. 버퍼 길이가 홀수 바이트이면 데이터가 올바르게 잘립니다. 전체 값이 청크로 반환되면 연결해서 올바른 값으로 다시 구성할 수 있습니다.

12버퍼 길이가 2자 미만인 경우, 즉 null 종료를 위한 공간이 충분하지 않으면 오버플로 오류가 보고됩니다.

참고 항목

NULL XML 값에 대한 데이터가 반환되지 않습니다.

XML 표준을 따르려면 UTF-16로 인코딩된 XML이 BOM(바이트 순서 표시), 즉 UTF-16 문자 코드 0xFEFF로 시작해야 합니다. WSTR 및 BSTR 바인딩으로 작업할 때 SQL Server Native Client는 바인딩에 의해 인코딩이 암시되므로 BOM을 요구하거나 추가하지 않습니다. BYTES, XML 또는 IUNKNOWN 바인딩을 사용하는 경우 다른 XML 프로세서 및 스토리지 시스템을 간단하게 처리할 수 있습니다. 이 경우 대부분의 XML 프로세서(SQL Server 포함)가 값의 처음 몇 바이트를 검사하여 인코딩을 추론하므로 BOM에 UTF-16로 인코딩된 XML이 있어야 하며, 애플리케이션은 실제 인코딩과 관련이 없습니다. BYTES, XML 또는 IUNKNOWN 바인딩을 사용하여 SQL Server Native Client에서 받은 XML 데이터는 항상 포함된 인코딩 선언 없이 BOM을 사용하여 UTF-16으로 인코딩됩니다.

OLE DB 핵심 서비스(IDataConvert)에서 제공하는 데이터 변환은 DBTYPE_XML 적용할 수 없습니다.

유효성 검사는 데이터를 서버로 보낼 때 수행됩니다. 클라이언트 쪽 유효성 검사 및 인코딩 변경 내용은 애플리케이션에서 처리해야 하며 XML 데이터를 직접 처리하지 않고 대신 DOM 또는 SAX 판독기를 사용하여 처리하는 것이 좋습니다.

DBTYPE_NULL 및 DBTYPE_EMPTY 입력 매개 변수에 바인딩할 수 있지만 출력 매개 변수 또는 결과에는 바인딩할 수 없습니다. 입력 매개 변수에 대해 바인딩할 경우 상태를 DBSTATUS_S_ISNULL 또는 DBSTATUS_S_DEFAULT로 설정해야 합니다.

DBTYPE_XML DBTYPE_EMPTY 및 DBTYPE_NULL 변환할 수 DBTYPE_EMPTY DBTYPE_XML 변환할 수 있지만 DBTYPE_NULL DBTYPE_XML 변환할 수 없습니다. 이는 DBTYPE_WSTR 일치합니다.

DBTYPE_IUNKNOWN 위의 표와 같이 지원되는 바인딩이지만 DBTYPE_XML DBTYPE_IUNKNOWN 간에는 변환이 없습니다. DBTYPE_IUNKNOWN DBTYPE_BYREF 사용할 수 없습니다.

OLE DB 행 집합 추가 및 변경 내용

SQL Server Native Client는 많은 핵심 OLE DB 스키마 행 집합에 새 값 또는 변경 내용을 추가합니다.

COLUMNS 및 PROCEDURE_PARAMETERS 스키마 행 집합

COLUMNS 및 PROCEDURE_PARAMETERS 스키마 행 집합에 추가된 열에는 다음 열이 포함됩니다.

열 이름 Type 설명
SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR XML 스키마 컬렉션이 정의된 카탈로그의 이름입니다. 비 XML 열 또는 형식화되지 않은 XML 열의 경우 NULL입니다.
SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR XML 스키마 컬렉션이 정의된 스키마의 이름입니다. 비 XML 열 또는 형식화되지 않은 XML 열의 경우 NULL입니다.
SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR XML 스키마 컬렉션의 이름입니다. 비 XML 열 또는 형식화되지 않은 XML 열의 경우 NULL입니다.

PROVIDER_TYPES 스키마 행 집합

PROVIDER_TYPES 스키마 행 집합에서는 xml 데이터 형식에 대한 COLUMN_SIZE 값이 0이고 DATA_TYPE이 DBTYPE_XML입니다.

SS_XMLSCHEMA 스키마 행 집합

새로운 스키마 행 집합인 SS_XMLSCHEMA는 클라이언트가 XML 스키마 정보를 검색할 수 있도록 도입되었습니다. SS_XMLSCHEMA 행 집합에는 다음 열이 포함됩니다.

열 이름 Type 설명
SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR XML 컬렉션이 속한 카탈로그입니다.
SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR XML 컬렉션이 속한 스키마입니다.
SCHEMACOLLECTIONNAME DBTYPE_WSTR 형식화된 XML 열에 대해서는 XML 스키마 컬렉션의 이름이고, 그렇지 않으면 NULL입니다.
TARGETNAMESPACEURI DBTYPE_WSTR XML 스키마의 대상 이름 공간입니다.
SCHEMACONTENT DBTYPE_WSTR XML 스키마 콘텐츠입니다.

각 XML 스키마는 카탈로그 이름, 스키마 이름, 스키마 컬렉션 이름 및 대상 이름 공간 URI(Uniform Resource Identifier)로 범위가 지정됩니다. 또한 이름이 DBSCHEMA_XML_COLLECTIONS 새 GUID도 정의됩니다. SS_XMLSCHEMA 스키마 행 집합에 대한 제한 및 제한된 열 수는 다음과 같이 정의됩니다.

GUID 제한 횟수 제한된 열
DBSCHEMA_XML_COLLECTIONS 4 SCHEMACOLLECTION_CATALOGNAME

SCHEMACOLLECTION_SCHEMANAME

SCHEMACOLLECTIONNAME

TARGETNAMESPACEURI

OLE DB 속성 집합 추가 및 변경 내용

SQL Server Native Client는 많은 핵심 OLE DB 속성 집합에 새 값 또는 변경 내용을 추가합니다.

DBPROPSET_SQLSERVERPARAMETER 속성 집합

OLE DB를 통해 xml 데이터 형식을 지원하기 위해 SQL Server Native Client는 다음 값을 포함하는 새 DBPROPSET_SQLSERVERPARAMETER 속성 집합을 구현합니다.

입력 형식 설명
SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR XML 스키마 컬렉션이 정의된 카탈로그(데이터베이스)의 이름입니다. SQL 세 부분으로 구성된 이름 식별자의 일부입니다.
SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR 스키마 컬렉션 내의 XML 스키마 이름입니다. SQL의 세 부분으로 구성된 이름 식별자의 일부입니다.
SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR 카탈로그 내 XML 스키마 컬렉션의 이름입니다. SQL의 세 부분으로 구성된 이름 식별자의 일부입니다.

DBPROPSET_SQLSERVERCOLUMN 속성 집합

ITableDefinition 인터페이스에서 테이블 만들기를 지원하기 위해 SQL Server Native Client는 DBPROPSET_SQLSERVERCOLUMN 속성 집합에 세 개의 새 열을 추가합니다.

입력 형식 설명
SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME VT_BSTR 형식화된 XML 열에 대해서는 이 속성이 XML 스키마가 저장된 카탈로그의 이름을 지정하는 문자열입니다. 다른 열 형식의 경우 이 속성은 빈 문자열을 반환합니다.
SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME VT_BSTR 형식화된 XML 열의 경우 이 속성은 이 열을 정의하는 XML 스키마의 이름을 지정하는 문자열입니다.
SSPROP_COL_XML_SCHEMACOLLECTIONNAME VT_BSTR 형식화된 XML 열의 경우 이 속성은 값을 정의하는 스키마 XML 스키마 컬렉션의 이름을 지정하는 문자열입니다.

SSPROP_PARAM 값과 마찬가지로 이러한 모든 속성은 선택 사항이며 기본적으로 비어 있습니다. SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME 및 SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME SSPROP_COL_XML_SCHEMACOLLECTIONNAME 지정된 경우에만 지정할 수 있습니다. XML을 서버에 전달할 때 이러한 값이 포함된 경우 현재 데이터베이스에 대한 존재(유효성)가 확인되고 인스턴스 데이터가 스키마에 대해 검사됩니다. 모든 경우에 유효하려면 모두 비어 있거나 모두 채워집니다.

OLE DB 인터페이스 추가 및 변경 내용

SQL Server Native Client는 많은 핵심 OLE DB 인터페이스에 새 값 또는 변경 내용을 추가합니다.

ISSCommandWithParameters 인터페이스

OLE DB를 통해 xml 데이터 형식을 지원하기 위해 SQL Server Native Client는 ISSCommandWithParameters 인터페이스 추가를 포함하여 다양한 변경 내용을 구현합니다. 이 새 인터페이스는 핵심 OLE DB 인터페이스인 ICommandWithParameters에서 상속됩니다. ICommandWithParameters에서 상속된 세 가지 메서드 외에; GetParameterInfo, MapParameterNamesSetParameterInfo; ISSCommandWithParameters는 서버 특정 데이터 형식을 처리하는 데 사용되는 GetParameterPropertiesSetParameterProperties 메서드를 제공합니다.

참고 항목

또한 ISSCommandWithParameters 인터페이스는 새 SSPARAMPROPS 구조를 사용합니다.

IColumnsRowset 인터페이스

SQL Server Native Client는 IColumnRowset::GetColumnsRowset 메서드에서 반환하는 행 집합에 다음 SQL Server 관련 열을 추가합니다. 이러한 열에는 XML 스키마 컬렉션의 세 부분으로 구성된 이름이 포함됩니다. XML이 아닌 열 또는 형식화되지 않은 XML 열의 경우 세 열 모두 NULL의 기본값을 사용합니다.

열 이름 Type 설명
DBCOLUMN_SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR XML 스키마 컬렉션이 속한 카탈로그

그렇지 않으면 NULL입니다.
DBCOLUMN_SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR XML 스키마 컬렉션이 속한 스키마입니다. 그렇지 않으면 NULL입니다.
DBCOLUMN_SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR 형식화된 XML 열에 대해서는 XML 스키마 컬렉션의 이름이고, 그렇지 않으면 NULL입니다.

IRowset 인터페이스

XML 열의 XML 인스턴스는 IRowset::GetData 메서드를 통해 검색됩니다. 클라이언트에서 지정한 바인딩에 따라 XML 인스턴스가 DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML, DBTYPE_STR, DBTYPE_BYTES로 검색되거나 DBTYPE_IUNKNOWN을 통해 인터페이스로 검색될 수 있습니다. 소비자가 DBTYPE_BSTR, DBTYPE_WSTR 또는 DBTYPE_VARIANT 지정하는 경우 공급자는 XML 인스턴스를 사용자가 요청한 형식으로 변환하고 해당 바인딩에 지정된 위치에 배치합니다.

소비자가 DBTYPE_IUNKNOWN 지정하고 pObject 인수를 NULL로 설정하거나 pObject 인수를 IID_ISequentialStream 설정하면 공급자는 소비자가 열에서 XML 데이터를 스트리밍할 수 있도록 소비자에게 ISequentialStream 인터페이스를 반환합니다. 그러면 ISequentialStream이 XML 데이터를 유니코드 문자 스트림으로 반환합니다.

DBTYPE_IUNKNOWN 바인딩된 XML 값을 반환할 때 공급자는 크기 값을 sizeof (IUnknown *)보고합니다. 이는 열이 DBTYPE_IUnknown 또는 DBTYPE_IDISPATCH 바인딩된 경우와 정확한 열 크기를 확인할 수 없는 경우 DBTYPE_IUNKNOWN/ISequentialStream에 의해 수행되는 방식과 일치합니다.

IRowsetChange 인터페이스

소비자는 두 가지 방법으로 열의 XML 인스턴스를 업데이트할 수 있습니다. 첫 번째는 공급자가 만든 스토리지 개체 ISequentialStream 을 통해서입니다. 소비자는 ISequentialStream::Write 메서드를 호출하여 공급자가 반환한 XML 인스턴스를 직접 업데이트할 수 있습니다.

두 번째 방법은 IRowsetChange::SetData 또는 IRowsetChange::InsertRow 메서드를 사용하는 것입니다. 이 방법을 사용할 경우 소비자 버퍼의 XML 인스턴스를 DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML 또는 DBTYPE_IUNKNOWN 유형의 바인딩에 지정할 수 있습니다.

DBTYPE_BSTR, DBTYPE_WSTR 또는 DBTYPE_VARIANT 경우 공급자는 소비자 버퍼에 있는 XML 인스턴스를 적절한 열에 저장합니다.

DBTYPE_IUNKNOWN/ISequentialStream의 경우 소비자가 스토리지 개체를 지정하지 않는 경우 소비자는 ISequentialStream 개체를 미리 만들고 XML 문서를 개체와 바인딩한 다음 IRowsetChange::SetData 메서드를 통해 공급자에게 개체를 전달해야 합니다. 또한 소비자는 스토리지 개체를 만들고, pObject 인수를 IID_ISequentialStream 설정하고, ISequentialStream 개체를 만든 다음, IRowsetChange::SetData 메서드에 ISequentialStream 개체를 전달할 수 있습니다. 두 경우 모두 공급자는 ISequentialStream 개체를 통해 XML 개체를 검색하여 적절한 열에 삽입할 수 있습니다.

IRowsetUpdate 인터페이스

IRowsetUpdate 인터페이스는 지연된 업데이트에 사용할 수 있는 기능을 제공합니다. 소비자가 IRowsetUpdate:Update 메서드를 호출할 때까지 행 집합에서 사용할 수 있는 데이터는 다른 트랜잭션에서 사용할 수 없습니다.

IRowsetFind 인터페이스

IRowsetFind::FindNextRow 메서드는 xml 데이터 형식에 사용할 수 없습니다. hAccessor 인수에 DBTYPE_XML 열이 지정되어 IRowsetFind::FindNextRow가 호출되면 DB_E_BADBINDINFO가 반환되며 검색 중인 열의 형식에 관계없이 발생합니다. 이외 다른 바인딩 유형의 경우 검색하는 열이 xml 데이터 형식이면 FindNextRow가 실패하며 DB_E_BADCOMPAREOP가 반환됩니다.

SQL Server Native Client ODBC 드라이버

SQL Server Native Client ODBC 드라이버에서는 xml 데이터 형식을 지원하기 위해 다양한 함수를 여러 번 변경했습니다.

SQLColAttribute

SQLColAttribute 함수에는 SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME 및 SQL_CA_SS _XML_SCHEMACOLLECTION_NAME 포함하여 세 개의 새 필드 식별자가 있습니다.

SQL Server Native Client ODBC 드라이버는 SQL_DESC_DISPLAY_SIZE 및 SQL_DESC_LENGTH 열에 대한 SQL_SS_LENGTH_UNLIMITED 보고합니다.

SQLColumns

SQLColumns 함수에는 SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SS_XML_SCHEMACOLLECTION_SCHEMA_NAME 및 SS_XML_SCHEMACOLLECTION_NAME 포함한 세 개의 새 열이 있습니다. 기존 TYPE_NAME 열은 XML 형식의 이름을 나타내는 데 사용되며 XML 형식 열 또는 매개 변수에 대한 DATA_TYPE SQL_SS_XML.

SQL Server Native Client ODBC 드라이버는 COLUMN_SIZE 및 CHAR_OCTET_LENGTH 값에 대한 SQL_SS_LENGTH_UNLIMITED 보고합니다.

SQLDescribeCol

SQL Server Native Client ODBC 드라이버는 SQLDescribeCol 함수에서 열 크기를 확인할 수 없는 경우 SQL_SS_LENGTH_UNLIMITED 보고합니다.

SQLGetTypeInfo

SQL Server Native Client ODBC 드라이버는 SQL_SS_LENGTH_UNLIMITED SQLGetTypeInfo 함수의 xml 데이터 형식에 대한 최대 COLUMN_SIZE 보고합니다.

SQLProcedureColumns

SQLProcedureColumns 함수에는 SQLColumns 함수와 동일한 열이 추가됩니다.

SQL Server Native Client ODBC 드라이버는 xml 데이터 형식의 최대 COLUMN_SIZE SQL_SS_LENGTH_UNLIMITED 보고합니다.

지원되는 변환

SQL에서 C 데이터 형식으로 변환할 때 다음과 같은 조건 하에 SQL_C_WCHAR, SQL_C_BINARY 및 SQL_C_CHAR를 모두 SQL_SS_XML로 변환할 수 있습니다.

  • SQL_C_WCHAR: 형식은 UTF-16이며, BOM(바이트 순서 표시)이 없으며 null 종료가 있습니다.

  • SQL_C_BINARY: 형식은 Null 종료 없이 UTF-16입니다. BOM이 서버에서 받은 데이터에 추가됩니다. 서버에서 빈 문자열을 반환하는 경우 BOM은 여전히 애플리케이션에 반환됩니다. 버퍼 길이가 홀수 바이트인 경우 데이터가 올바르게 잘립니다. 전체 값이 청크로 반환되면 연결하여 올바른 값을 다시 구성할 수 있습니다.

  • SQL_C_CHAR: 형식은 null 종료를 사용하여 클라이언트 코드 페이지에서 인코딩된 멀티바이트 문자입니다. 서버에서 제공하는 UTF-16에서 변환하면 데이터가 손상될 수 있으므로 이 바인딩은 사용하지 않는 것이 좋습니다.

C에서 SQL 데이터 형식으로 변환할 때 다음과 같은 조건 하에 SQL_C_WCHAR, SQL_C_BINARY 및 SQL_C_CHAR를 모두 SQL_SS_XML로 변환할 수 있습니다.

  • SQL_C_WCHAR: BOM은 항상 서버로 전송되는 데이터에 추가됩니다. 데이터가 이미 BOM으로 시작된 경우 버퍼 시작 시 두 개의 BOM이 생성됩니다. 서버는 첫 번째 BOM을 사용하여 인코딩을 UTF-16으로 인식한 다음 삭제합니다. 두 번째 BOM은 너비가 0이 아닌 공백 문자로 해석됩니다.

  • SQL_C_BINARY: 변환이 수행되지 않고 데이터가 "있는 그대로" 서버에 전달됩니다. UTF-16 데이터는 BOM으로 시작해야 합니다. 그렇지 않으면 서버에서 인코딩을 올바르게 인식하지 못할 수 있습니다.

  • SQL_C_CHAR: 데이터는 클라이언트에서 UTF-16으로 변환되고 SQL_C_WCHAR(BOM 추가 포함)와 마찬가지로 서버로 전송됩니다. XML이 클라이언트 코드 페이지에 인코딩되지 않은 경우 데이터가 손상될 수 있습니다.

XML 표준을 따르려면 UTF-16로 인코딩된 XML이 BOM(바이트 순서 표시), 즉 UTF-16 문자 코드 0xFEFF로 시작해야 합니다. SQL_C_BINARY 바인딩으로 작업할 때 SQL Server Native Client는 바인딩에 의해 인코딩이 암시되므로 BOM을 요구하거나 추가하지 않습니다. 다른 XML 프로세서 및 스토리지 시스템을 간단하게 처리할 수 있도록 하기 위한 것입니다. 이 경우 BOM은 UTF-16으로 인코딩된 XML과 함께 있어야 하며, 대부분의 XML 프로세서(SQL Server 포함)가 값의 처음 몇 바이트를 검사하여 인코딩을 추론하기 때문에 애플리케이션은 실제 인코딩과 관련이 없습니다. SQL_C_BINARY 바인딩을 사용하여 SQL Server Native Client에서 받은 XML 데이터는 항상 포함된 인코딩 선언 없이 BOM을 사용하여 UTF-16으로 인코딩됩니다.

참고 항목

SQL Server Native Client 기능
ISSCommandWithParameters(OLE DB)