根据Excel工作表中的值从SQL Server数据源获取Excel数据

时间:2018-04-10 08:02:52

标签: sql-server excel

让我们在Excel表格中说,我有以下内容" table":

ZipCodes |
---------+
  4059   |
  5806   |
  4529   |

我需要从SQL Server视图中获取数据 WHERE ZipCodes具有Excel表格中的一个值。

我希望用户能够根据需要添加尽可能多的ZipCodes,而不是手动调整查询。

我看了this question,但我无法让它发挥作用。

我坚持将值列表传递给sql查询。如果我传递一个ZipCode,它就可以工作。

STH。这样会对我有所帮助:

WHERE  ZipCode IN (SELECT * FROM  [sheet2$a1:a2])

但这打破了查询。

1 个答案:

答案 0 :(得分:2)

这里的一个解决方案是使用OPENROWSET。经过讨论,看来Excel文件的位置可以并且将会改变;这很好,但意味着我们需要构建一个动态SQL解决方案,因为OPENROWSET需要它的参数的文字字符串(没有变量)。

首先,我不知道您安装的ACE驱动程序的版本。因此在我的代码中我使用了我安装的驱动程序;这是2010年的驱动程序(版本12)。如果那不是您正在使用的版本,则您需要更改我评论的值。

通常,OPENROWSET查询可能如下所示:

SELECT *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', --This declares the Driver. You may need to change this
                'Excel 8.0;HDR=YES;;Database=\\YourFileServer\yourShare\YourFile.xlsx',
                'SELECT *
                FROM [Sheet1$A1:G];');

从第2行开始,这将从列A返回到G的所有行。第1行将被假定为包含标题(HDR=YES);如果您没有标题使用HDR=NO

这里的问题是我们不能在这里传递一个变量。因此,我们需要做一些更有活力的事情。这可以为您提供以下内容:

DECLARE @File nvarchar(500); --This would be your parameter
SET @File = N'\\YourFileServer\yourShare\YourFile.xlsx';

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT *' + NCHAR(10) +
           N'FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',' + NCHAR(10) +
           N'                ' + QUOTENAME(N'Excel 8.0;HDR=YES;Database=' + @File,N'''') + N','  + NCHAR(10) +
           N'                ''SELECT *'  + NCHAR(10) +
           N'                 FROM [Sheet1$A1:G];'');';
PRINT @SQL;
EXEC sp_executesql @SQL;

现在,最后,您要对表/视图使用此数据。因此,这可能最终看起来像这样(假设您的视图被称为Customer_vw,列A中的excel文件中的数据,以及两个数据集中的列被称为ZipCode):

DECLARE @File nvarchar(500); --This would be your parameter
SET @File = N'\\YourFileServer\yourShare\YourFile.xlsx';

DECLARE @SQL nvarchar(MAX);
SET @SQL = N'WITH ExcelZips AS (' + NCHAR(10) +
           N'    SELECT ZipCode' + NCHAR(10) +
           N'    FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',' + NCHAR(10) +
           N'                    ' + QUOTENAME(N'Excel 8.0;HDR=YES;Database=' + @File,N'''') + N','  + NCHAR(10) +
           N'                    ''SELECT *'  + NCHAR(10) +
           N'                     FROM [Sheet1$A1:A];''))' + NCHAR(10) +
           N'SELECT [YourColumns]' + NCHAR(10) +
           N'FROM Customer_vw C' + NCHAR(10) +
           N'     JOIN ExcelZips EZ ON C.ZipCode = EZ.ZipCode --Note that EZ.ZipCode will not show in intellisense' + NCHAR(10) +
           N'WHERE ...;'; --You'll need to complete the WHERE here, and add any ORDER BY etc.
PRINT @SQL;
EXEC sp_executesql @SQL;

请注意,我在查询中有PRINT个语句。 这些是您的朋友。我(个人)建议您先注释EXEC语句,然后使用PRINT语句。检查PRINT的输出是否正确。如果它然后运行它,如果你遇到错误,请从PRINT而不是动态SQL中输出输出。修复非动态SQL后,将更改传播到动态SQL。

希望这能解释一切。如果您有任何疑问,请询问。