让我们在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])
但这打破了查询。
答案 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。
希望这能解释一切。如果您有任何疑问,请询问。