Excel - не показывает столбец varbinary (16) из базы данных SQL Server

У меня есть хранимая процедура SQL Server 2014, которую я добавил в книгу Excel 2013 в качестве подключения к данным.

Хранимая процедура возвращает таблицу, определенную следующим образом:

create table #rollups
(
    ID_INT_EXT_KEY varbinary(16) not null,
    AS_OF_DATE date not null,
    FOR_MONTH int not null,
    FOR_YEAR int not null,
    FINAL_REPORT_DEPT varchar(100) null,
    PROV_NAME varchar(100) null,
    EXTERNAL_FLAG bit not null,
    YTD_VISITS decimal(15,2) not null default 0,
    YTD_CHARGED decimal(15,2) not null default 0,
    YTD_PROCS decimal(15,2) not null default 0,
    MTD_VISITS decimal(15,2) not null default 0,
    MTD_CHARGED decimal(15,2) not null default 0,
    MTD_PROCS decimal(15,2) not null default 0,
    YTD_VISITS_DIFFLASTMONTH decimal(15,2) not null default 0,
    YTD_CHARGED_DIFFLASTMONTH decimal(15,2) not null default 0,
    YTD_PROCS_DIFFLASTMONTH decimal(15,2) not null default 0
);

-- insert data to the temp table
-- select from the temp table

У меня нет проблем с хранимой процедурой, она работает как задумано.

Я добавил его на лист Excel как запрос OLE DB, тип команды — SQL, а текст команды — просто имя хранимой процедуры.

Он возвращает данные (несколько тысяч строк), как и ожидалось, за исключением первого столбца ID_INT_EXT_KEY (который представляет собой хэш нескольких столбцов). Колонка вообще не втягивается в лист, не пустая, не скрытая. Его просто нет. Я попытался включить Row Numbers, думая, что, может быть, это как-то связано с этим, но нет.

В SSMS столбец есть.

На самом деле это не проблема для того, для чего я его использую, но это сбивает с толку, и мне интересно, что я могу с этим поделать, за исключением изменения типов данных возвращаемой таблицы.

Редактировать:

Вопрос: учитывая, что у меня есть хранимая процедура, которая возвращает таблицу, а один из столбцов является varbinary, есть ли способ получить этот столбец в Excel (используя стандартное подключение к внешним данным), без создания или изменения каких-либо объектов базы данных?


person Eric    schedule 06.07.2016    source источник
comment
VARBINARY(16) - это тип данных, который не видим или, лучше сказать, отображаем... Есть 16 байт чего-то. Что, по вашему мнению, должен делать с этим Excel? Вы можете преобразовать его в HEX-строку (состоящую из 0-9 и от A до H и в основном начинающуюся с 0x, чтобы указать это. Вы можете преобразовать ее в base64 или, возможно, преобразовать ее в тип длиной 16 байтов с довольно случайным значением. ... Что бедному Excel делать с этим значением?   -  person Shnugo    schedule 07.07.2016
comment
Что ж, SSMS преобразует его в шестнадцатеричную строку, как вы предложили. У меня было ощущение, что это связано с тем, что столбец содержит двоичные данные. Это говорит мне, почему это происходит, но могу ли я что-нибудь сделать, чтобы решить эту проблему, не прибегая к изменению объектов базы данных? т.е. есть ли что-то, что я могу сделать из Excel, чтобы показать этот столбец как шестнадцатеричное значение?   -  person Eric    schedule 07.07.2016
comment
Я только что обновил свой вопрос...   -  person Shnugo    schedule 07.07.2016


Ответы (1)


Из вашего комментария я понимаю, что SSMS преобразует его в шестнадцатеричную строку.

Это неправда, это просто выглядит как HEX-строка...

У SSMS та же проблема, что и у Excel: как отобразить двоичные данные? SSMS выбирает HEX-строку, но тип данных этого столбца по-прежнему VARBINARY...

Если вы хотите получить настоящую строку, похожую на шестнадцатеричное значение, вы можете использовать встроенную функцию:

DECLARE @Varbin VARBINARY(16)=0x00112233445566778899AABBCCDDEEFF;
SELECT @Varbin AS A_varbinary_VALUE;
SELECT DATALENGTH(@Varbin);

DECLARE @ConvertedToString NVARCHAR(MAX)= sys.fn_varbintohexstr(@Varbin);
SELECT @ConvertedToString;

ОБНОВИТЬ

Поскольку ваш столбец VARBINARY(16) лучше всего должен быть прямым приведением к GUID, что составляет 16 байтов на определение:

DECLARE @CovertedToGUID UNIQUEIDENTIFIER=CAST(@Varbin AS UNIQUEIDENTIFIER);
SELECT @CovertedToGUID;

Вы можете отбросить это обратно:

SELECT CAST(@CovertedToGUID AS VARBINARY(MAX))

Но остался еще один вопрос: Почему?

person Shnugo    schedule 06.07.2016
comment
Я не имел в виду буквальное преобразование его в шестнадцатеричную строку — я имел в виду преобразование в контексте того, как отображаются данные. Почему не имеет отношения к вопросу - я цепляюсь за этот хэш по разным причинам (это часть базовой хранимой процедуры, используемая в соединениях и для суммирования данных, и время от времени полезна вне этого). Как я уже сказал, это не обязательно для этой конкретной книги, но я просто ищу любой способ вытащить столбец без изменения SP или создания другого объекта БД - на случай, если он мне понадобится в будущем, и насытить мой любопытство. - person Eric; 07.07.2016
comment
А, понятно... В большинстве случаев было гораздо лучше не использовать SP для извлечения данных, а использовать встроенные функции с табличным значением. В этом случае вы можете импортировать это с помощью оператора SQL из EXCEL и выполнить преобразование там... Вы можете попытаться определить еще один SP, обернув первый, если вы не хотите его менять. Excel будет отображать шестнадцатеричную строку, поскольку она будет отображать GUID... Без обмана (VBA!) Я не знаю никакого обходного пути с простой функцией импорта... - person Shnugo; 07.07.2016
comment
Я полагаю, что я изучил маршрут TVF, и это было невозможно, потому что SP использует временные таблицы из соображений производительности (табличные переменные были очень медленными). Недавно я узнал, что табличную переменную можно индексировать, поэтому, возможно, я вернусь к идее функции в ближайшее время. Это было бы неплохо, потому что тогда я мог бы просто преобразовать хэш в varchar в самом соединении данных. - person Eric; 07.07.2016
comment
@ Эрик, да, если SP использует подход с несколькими операторами, временные таблицы и тому подобное, вы не сможете легко перенести это в TVF. Вот почему я предложил обертку SP, в которой вы сначала вставляете существующий результат SP в таблицу, а затем создаете новый вывод с правильным приведением. В любом случае: если бы этот ответ был полезен, я бы попросил вас проголосовать за него. И если это решило вашу проблему, пожалуйста, отметьте проверку принятия, спасибо! - person Shnugo; 07.07.2016
comment
Помните, вопрос в том, как это сделать, не создавая и не изменяя никаких объектов базы данных — возможно, я вас неправильно понимаю. Я обновлю свой вопрос, чтобы быть более кратким. - person Eric; 07.07.2016
comment
@ Эрик, это ты говорил об изменении этого на TVF и т. Д. :-) Насколько я знаю, нет никакого способа позволить Excel dsiplay VARBINARY, полученный из результата SP, просто вызвав его по его имени. Вы можете заполнить Recordset с помощью VBA и заполнить ячейки самостоятельно, или вы можете предоставить TVF, или вы можете изменить (или обернуть) SP, чтобы обеспечить правильный тип. Я думаю, это все. Не обвиняйте меня в недостающих функциях :-) - person Shnugo; 07.07.2016
comment
@Eric, в Excel можно переключить источник соединения на SQL-Statement. Я не знаю, но может быть возможно использовать ваш оператор create table вместе с EXEC YourSP INTO , чтобы сначала заполнить набор результатов в таблицу, а затем выполнить окончательный SELECT с правильным приведением оттуда? - person Shnugo; 07.07.2016
comment
создать таблицу ... вставить в #temp exec sp определенно возможно - я попробую это завтра. - person Eric; 07.07.2016
comment
Конечно, тогда возникает вопрос: сколько разрешений необходимо предоставить пользователю, нажимающему кнопку обновления? Но это помимо рассматриваемого вопроса. Спасибо за все предложения! - person Eric; 07.07.2016
comment
@Eric Лучше, чем CREATE TABLE, было - по крайней мере, с точки зрения прав - DECLARE @tbl TABLE... - person Shnugo; 07.07.2016