Использование параметра BINARY BASE64
Применимо к:База данных
SQL Server Azure SQL Управляемый экземпляр SQL Azure
Если в запросе задан аргумент BINARY BASE64, двоичные данные возвращаются в формате кодирования base64.
Если параметр BINARY BASE64 не указан в запросе, то по умолчанию режим AUTO поддерживает кодирование двоичных данных в URL-адресе. Возвращается ссылка на относительный URL-адрес виртуального корня базы данных. Эта ссылка указывает на базу данных, в которой был выполнен запрос. Возвращаемую ссылку можно использовать для доступа к действительным двоичным данным в последующих операциях. Этот доступ достигается с помощью запроса SQLXML ISAPI dbobject
. Для идентификации изображения запрос должен предоставить достаточно данных. Такие сведения могут включать столбцы первичного ключа.
Псевдоним столбца
Не используйте псевдоним для двоичного столбца при запросе представления и использовании режима FOR XML AUTO. Если используется псевдоним, он возвращается в кодировке URL-адреса двоичных данных. В последующих операциях псевдоним не имеет смысла. Для получения изображения нельзя использовать бессмысленный псевдоним и кодировку URL-адреса.
Приведение к большому двоичному объекту
В запросе SELECT приведение любого столбца к большому двоичному объекту (BLOB) делает столбец временной сущностью. Будучи временным, BLOB-объект теряет связанное имя таблицы и имя столбца. Это приводит к тому, что запросы в режиме AUTO создают ошибку, так как система не знает, куда поместить это значение в иерархию XML.
Например, рассмотрим следующую таблицу с одной строкой.
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==" />