SQL Server ネイティブ クライアントでの XML データ型の使用

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

重要

SQL Server Native Client (SNAC と略されることがよくあります) は、SQL Server 2022 (16.x) と SQL Server Management Studio 19 (SSMS) から削除されました。 SQL Server Native Client (SQLNCLI または SQLNCLI11) とレガシ Microsoft OLE DB Provider for SQL Server (SQLOLEDB) は、新しいアプリケーション開発には推奨されません。 今後、新しい Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server または最新の Microsoft ODBC Driver for SQL Server に切り替えてください。 SQL Server データベース エンジン (バージョン 2012 から 2019) のコンポーネントとして付属する SQLNCLI については、このサポート ライフサイクルの例外を参照してください。

SQL Server 2005 (9.x) には xml データ型が導入されています。このデータ型を使用すると XML ドキュメントや XML フラグメントを SQL Server データベースに格納できます。 xml データ型は SQL Server での組み込みデータ型の 1 つであり、intvarchar などの他の組み込みデータ型といくつかの点で似ています。 xml データ型は、他の組み込みデータ型と同様に、テーブル作成時の列の型、変数の型、パラメーターの型、または関数の戻り値の型として使用したり、CAST 関数や CONVERT 関数でも使用できます。

プログラミングの考慮事項

XML は自己記述型で、必要に応じて、次のようにドキュメントのエンコードを指定する XML ヘッダーを含めることができます。

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

XML 標準では、ドキュメントの先頭の数バイトを調べることで、ドキュメントで使用しているエンコードを XML プロセッサで検出する方法が説明されています。 アプリケーションで指定するエンコードとドキュメントで指定されているエンコードが競合する場合があります。 バインドされたパラメーターとして渡されるドキュメントの場合、SQL Server では XML がバイナリ データとして扱われるので、データ変換は行われず、XML パーサーはドキュメントに指定されたエンコードを問題なく使用することができます。 ただし、WSTR としてバインドされた XML データの場合、そのドキュメントが Unicode でエンコードされていることをアプリケーションで確認する必要があります。 この場合、必然的にドキュメントが DOM に読み込まれることになり、エンコードが Unicode に変更され、ドキュメントはシリアル化されます。 この処理が行われないと、データ変換が行われ、結果として無効なまたは破損した 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::GetColumnsIRowChange::SetColumnsICommand::Execute などの通常のインターフェイスを使用することにより、取得、挿入、または更新することもできます。 取得の場合と同様に、アプリケーション プログラムは、テキスト文字列または ISequentialStream を SQL SERVER NATIVE CLIENT OLE DB プロバイダーに渡すことができます。

注意

ISequentialStream インターフェイスを使用して XML データを文字列形式で送信するには、DBTYPE_IUNKNOWN を指定して ISequentialStream を取得し、その pObject 引数をバインドの際に NULL に設定する必要があります。

コンシューマーのバッファーが小さすぎて取得した XML データが切り捨てられるときは、データ長が 0xffffffff で返されます。この値は、長さが不明であることを意味します。 この動作は、実際のデータの前に長さの情報を送信しないでクライアントにストリーム送信されるデータ型の実装と一貫性を持たせています。 場合によっては、プロバイダーが IRowset::GetData などの値全体をバッファーに格納し、データ変換が実行されたときに、実際の長さが返されることがあります。

SQL Server に送信される XML データは、サーバーではバイナリ データとして扱われます。 その結果、変換が行われず、XML パーサーが XML エンコードを自動検出できます。 これにより、広範な XML ドキュメント (UTF-8 でエンコードされた XML ドキュメントなど) を SQL Server への入力として受け取ることができます。

入力 XML が DBTYPE_WSTR にバインドされる場合、不要なデータ変換によってデータが破損しないようにするために、アプリケーションでは入力 XML が Unicode でエンコードされていることを確認する必要があります。

データ バインドと強制型変換

次の表に、特定のデータ型を SQL Server の xml データ型と共に使用した場合に行われるバインドおよび強制型変換を示します。

データ型 SQL Server の

XML
SQL Server の

XML 以外から
サーバーからの

XML
サーバーからの

XML 以外から
DBTYPE_XML パス スルー6、7 エラー1 OK11、6 エラー8
DBTYPE_BYTES パス スルー6、7 N/A2 11、6 該当なし 2
DBTYPE_WSTR パス スルー6、10 該当なし 2 OK4、6、12 該当なし 2
DBTYPE_BSTR パス スルー6、10 該当なし 2 3 該当なし 2
DBTYPE_STR OK6、9、10 該当なし 2 5、6、12 該当なし 2
DBTYPE_IUNKNOWN ISequentialStream 経由のバイト ストリーム7 該当なし 2 ISequentialStream 経由のバイト ストリーム11 該当なし 2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) パス スルー6、7 該当なし 2 該当なし 該当なし 2
DBTYPE_VARIANT (VT_BSTR) パス スルー6、10 該当なし 2 3 該当なし 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 で終端が示される、マルチバイト文字列形式です。 Unicode を使用できるサーバーから変換するとデータが破損する場合があるので、このバインドはお勧めしません。

6BY_REF を使用できます。

7UTF-16 データは BOM で始まる必要があります。 BOM で始まらない場合は、サーバーでエンコードが正しく認識されないことがあります。

8検証は、アクセサーの作成時、またはフェッチ時に行われます。 エラーは DB_E_ERRORSOCCURRED です。その場合、バインドの状態は DBBINDSTATUS_UNSUPPORTEDCONVERSION に設定されます。

9データは、サーバーに送信される前にクライアントのコード ページを使用して Unicode に変換されます。 ドキュメントのエンコードがクライアントのコード ページと一致しない場合、変換によってデータが破損することがあるので、このバインドはお勧めしません。

10サーバーに送信されるデータには必ず BOM が追加されます。 既にデータが BOM で始まる場合、この動作により、バッファーの先頭に 2 つの BOM が存在することになります。 サーバーでは、1 つ目の BOM からエンコードを UTF-16 と認識した後、その BOM を破棄します。 2 つ目の BOM は、幅が 0 の改行を行わない空白文字として解釈されます。

11形式は UTF-16 です。エンコード仕様は付加されません。サーバーから受け取ったデータに BOM が追加されます。 サーバーから空文字列が返されても、アプリケーションには BOM が返されます。 バッファー長が奇数バイトの場合、データは適切に切り捨てられます。 1 つの値が複数のチャンクで返される場合、それぞれを連結して正しい値を再構成できます。

12バッファーの長さが 2 文字未満の場合(つまり、null 終端に十分な領域がない)、オーバーフロー エラーが報告されます。

注意

NULL の XML 値の場合は、データは返されません。

XML 標準では、UTF-16 でエンコードされた XML をバイト順マーク (BOM) で始める必要があります。BOM は UTF-16 の文字コードでは 0xFEFF です。 WSTR および BSTR バインドを使用する場合、SQL Server Native Clientでは、バインドによってエンコードが暗黙的に指定されるため、BOM を必要としたり追加したりすることはありません。 BYTES バインド、XML バインド、または IUNKNOWN バインドを使用する場合、その目的は他の XML プロセッサや XML ストレージ システムでの処理を簡単にすることです。 この場合、BOM は UTF-16 でエンコードされた XML を示し、SQL Server を含め XML プロセッサの多くは値の先頭の数バイトを調べてエンコードを推定するので、アプリケーションで実際のエンコードを考慮する必要はありません。 BYTES、XML、または IUNKNOWN バインディングを使用してSQL Server Native Clientから受信した XML データは、常に BOM を使用し、埋め込みエンコード宣言なしで UTF-16 でエンコードされます。

OLE DB Core Services で提供されるデータ変換 (IDataConvert) は、DBTYPE_XML 型には適用できません。

検証はデータがサーバーに送信されたときに行われます。 クライアント側の検証とエンコードの変更はアプリケーションで処理する必要がありますが、直接処理するのではなく、DOM リーダーや SAX リーダーを使用して XML データを処理することを強くお勧めします。

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 スキーマ行セットと 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 スキーマ行セット

クライアントで XML スキーマ情報を取得できるように、新しいスキーマ行セット SS_XMLSCHEMA が導入されました。 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 スキーマのスコープは、カタログ名、スキーマ名、スキーマ コレクション名、および対象名前空間を識別する Uniform Resource Identifier (URI) 別に設定されます。 また、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 プロパティ セットを実装します。

Name 説明
SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR XML スキーマ コレクションを定義しているカタログ (データベース) の名前。 SQL の 3 部構成による名前の識別子の一部になります。
SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR スキーマ コレクションに含まれている XML スキーマの名前。 SQL の 3 部構成による名前の識別子の一部になります。
SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR カタログに含まれている XML スキーマ コレクションの名前。SQL の 3 部構成による名前の識別子の一部になります。

DBPROPSET_SQLSERVERCOLUMN プロパティ セット

ITableDefinition インターフェイスでのテーブルの作成をサポートするために、SQL Server Native Client DBPROPSET_SQLSERVERCOLUMN プロパティ セットに 3 つの新しい列を追加します。

Name 説明
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 から継承された 3 つのメソッドに加えて、GetParameterInfoMapParameterNamesおよび SetParameterInfo;ISSCommandWithParameters には、サーバー固有のデータ型を処理するために使用される GetParameterProperties メソッドと SetParameterProperties メソッドが用意されています。

注意

ISSCommandWithParameters インターフェイスでは、新しい SSPARAMPROPS 構造体も使用されます。

IColumnsRowset インターフェイス

SQL Server Native Clientは、IColumnRowset::GetColumnsRowset メソッドによって返される行セットに、次のSQL Server固有の列を追加します。 これらの列には、XML スキーマ コレクションの 3 部構成の名前が含まれます。 XML 以外の列または型指定されていない XML 列の場合、これら 3 列の既定値はすべて 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 を設定した場合、プロバイダーから ISequentialStream インターフェイスが返されるので、列の XML データをストリーム出力できます。 その後、ISequentialStream から XML データが Unicode 文字のストリームとして返されます。

プロバイダーは DBTYPE_IUNKNOWN にバインドされた XML 値を返すときに、sizeof (IUnknown *) でサイズ値を報告します。 この動作は、列が DBTYPE_IUnknown または DBTYPE_IDISPATCH としてバインドされる場合行われる動作、および正確な列のサイズを特定できない場合に DBTYPE_IUNKNOWN や ISequentialStream で行われる動作と同じです。

IRowsetChange インターフェイス

コンシューマーは、列の XML インスタンスを 2 とおりの方法で更新できます。 1 つ目の方法では、プロバイダーで作成されるストレージ オブジェクト ISequentialStream を使用します。 コンシューマーは ISequentialStream::Write メソッドを呼び出して、プロバイダーから返された XML インスタンスを直接更新できます。

2 つ目の方法では、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 オブジェクトを作成してから、その ISequentialStream オブジェクトを IRowsetChange::SetData メソッドに渡すこともできます。 どちらの場合も、プロバイダーは 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を含む 3 つの新しいフィールド識別子があります。

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を含む 3 つの新しい列があります。 既存の TYPE_NAME 列を使用して XML 型の名前が示されます。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 ドライバーは、SQLGetTypeInfo 関数の xml データ型の最大COLUMN_SIZEとしてSQL_SS_LENGTH_UNLIMITEDを報告します。

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: 形式は UTF-16 で、NULL で終端は示されません。 サーバーから受け取ったデータに BOM が追加されます。 サーバーから空文字列が返されても、アプリケーションには BOM が返されます。 バッファー長が奇数バイトの場合、データは適切に切り捨てられます。 1 つの値が複数のチャンクで返される場合、それぞれを連結して正しい値を再構成できます。

  • 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 で始まる場合、この動作により、バッファーの先頭に 2 つの BOM が存在することになります。 サーバーでは、1 つ目の BOM からエンコードを UTF-16 と認識した後、その BOM を破棄します。 2 つ目の BOM は、幅が 0 の改行を行わない空白文字として解釈されます。

  • SQL_C_BINARY: 変換は実行されません。データは "そのまま" サーバーに渡されます。UTF-16 データは BOM で始まる必要があります。そうでない場合は、エンコードがサーバーによって正しく認識されない可能性があります。

  • SQL_C_CHAR: データはクライアント上で UTF-16 に変換され、サーバーにそのまま SQL_C_WCHAR として送信されます (ただし、BOM が追加されます)。 XML がクライアントのコード ページでエンコードされない場合、この変換が原因でデータが破損することがあります。

XML 標準では、UTF-16 でエンコードされた XML をバイト順マーク (BOM) で始める必要があります。BOM は UTF-16 の文字コードでは 0xFEFF です。 SQL_C_BINARY バインドを使用する場合、エンコードはバインディングによって暗黙的に指定されるため、SQL Server Native Clientでは BOM を必要としたり追加したりすることはありません。 SQL_C_BINARY バインドを使用する目的は、その他の XML プロセッサや 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)