我有一个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(这是几列的散列)除外。该列根本不会被拉入纸张,而不是空白,不会被隐藏。它不在那里。我试着打开行数,想想可能与它有关,但没有。
在SSMS中,列就在那里。
对于我正在使用它的内容来说,这不是一个真正的问题,但它令人困惑,我想知道我能做些什么,而不是改变返回表的数据类型。
编辑:
问题:假设我有一个返回表的存储过程,其中一列是varbinary,是否可以将此列导入Excel (使用标准的外部数据连接),而不创建或修改任何数据库对象?
答案 0 :(得分:0)
根据您的评论,我将 SSMS转换为十六进制字符串。
这不是真的,它只是看起来像一样的HEX-string ...
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))
但还有一个问题:为什么?