BINARY BASE64 オプションの使用

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

クエリに BINARY BASE64 オプションを指定すると、バイナリ データが base64 エンコード形式で返されます。

BINARY BASE64 オプションをクエリ内で指定しない場合、既定では、AUTO モードでバイナリ データの URL エンコードがサポートされます。 データベースの仮想ルートへの相対 URL の参照が返されます。 この参照は、クエリが実行されたデータベースに対するものです。 返された参照は、それ以降の操作で実際のバイナリ データにアクセスするときに使用できます。 このアクセスは SQLXML ISAPI dbobject クエリを使用することで実現されます。 画像を識別するために十分な情報をクエリで指定する必要があります。 そのような情報には、主キーの列が含まれる場合があります。

列の別名

FOR XML AUTO モードを使用して、ビューに対してクエリを実行するときは、バイナリ列に別名を使用しないでください。 別名を使用する場合、バイナリ データの URL エンコードでその別名が返されます。 それ以降の操作では、別名は無意味になります。 意味のない別名と URL エンコードを使用して画像を取得することはできません。

BLOB に型変換する

SELECT クエリでは、任意の列をバイナリ ラージ オブジェクト (BLOB) に型変換すると、列が一時エンティティになります。 一時的であるため、BLOB は、関連付けられている自身のテーブル名と列名を失います。 この型変換により、AUTO モードのクエリでエラーが発生します。システムでは、XML 階層内でのこの値の配置場所が認識されないためです。

たとえば、次のテーブルと、その中の 1 行について考えてみます。

CREATE TABLE MyTable (Col1 int PRIMARY KEY, Col2 binary)
INSERT INTO MyTable VALUES (1, 0x7);

次のクエリでは、エラーが発生します。このエラーは、BLOB (バイナリ ラージ オブジェクト) に型変換することで引き起こされます。

SELECT Col1,
CAST(Col2 as image) as Col2
FROM MyTable
FOR XML AUTO;

これを解決するには、BINARY BASE64 オプションを FOR XML 句に追加します。 型変換を削除すると、クエリから正しい結果が得られます。

SELECT Col1,
CAST(Col2 as image) as Col2
FROM MyTable
FOR XML AUTO, BINARY BASE64;

次のような正しい結果が予想されます。

<MyTable Col1="1" Col2="Bw==" />

関連項目

FOR XML での AUTO モードの使用