我需要一份报告,作为选择参数/过滤器的一部分,用户还选择要上传的 Excel 文件。然后,Excel 中的数据将用作查询的一部分。
我的问题是,这可能吗?如何设置选择参数来选择文件? 预先感谢。
我搜索并研究了各种选项,但没有找到解决方案
警告: 为了安全起见,这个答案有很多你应该避免的事情,这样做的风险由你自己承担!
要获取文件列表,您可以使用 xp_cmdshell 执行命令,您需要在服务器上允许此操作,因为默认情况下它是关闭的。除此之外,您可以做一些像这样简单的事情。
DECLARE @filespec varchar(1000) = '\\myServer\MyFolder\UploadsToSQL\MyFiles\*.xlsx'
DECLARE @cmd varchar(1000) = 'dir ' + @filespec + ' /b'
exec xp_cmdshell @cmd
如果您将其用作数据集查询,它将返回匹配文件的列表,您可以使用它来填充参数下拉列表。
一旦选择了其中一个文件并假设参数名为
@file
,那么您可以执行以下操作来读取中的数据
注意:我已经设置了一个具有所有所需访问权限的登录名 (AceDriverLogin),以便此功能正常工作。
DECLARE @file varchar(1000) = '\\myServer\MyFolder\UploadsToSQL\MyFiles\MyTestFile.xlsx'
DECLARE @XLSelect varchar(2000)
SET @XLSelect =
'SELECT *
FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',''Excel 12.0;Database=' + @file + ';HDR=YES'',''SELECT * FROM [Sheet1$]'') '
exec (@XLSelect) as login = 'AceDriverLogin'
这将返回“Sheet1”的内容
如果您需要对结果进行更多处理,那么您需要创建一个临时表来插入数据,然后您可以对临时表执行您喜欢的操作。
类似这样的事情
DECLARE @file varchar(1000) = '\\myServer\MyFolder\UploadsToSQL\MyFiles\MyTestFile.xlsx'
CREATE TABLE #xlData ([FirstColumn] varchar(100), [SecondColumn] varchar(100), [ThirdColumn] varchar(100))
DECLARE @XLSelect varchar(2000)
SET @XLSelect =
'INSERT INTO #xlData ([FirstColumn], [SecondColumn], [ThirdColumn]) ' +
'SELECT [FirstColumn], [SecondColumn], [ThirdColumn]
FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',''Excel 12.0;Database=' + @file + ';HDR=YES'',''SELECT * FROM [Sheet1$]'') '
exec (@XLSelect) as login = 'AceDriverLogin'
SELECT * FROM #xlData