Sql server 根据Excel工作表中的值,从SQL Server数据源将数据获取到Excel中
假设在我的Excel表格中,我有以下“表格”: 我需要从SQL Server视图中获取数据,其中列Sql server 根据Excel工作表中的值,从SQL Server数据源将数据获取到Excel中,sql-server,excel,Sql Server,Excel,假设在我的Excel表格中,我有以下“表格”: 我需要从SQL Server视图中获取数据,其中列ZipCodes在我的Excel表中有一个值 我希望用户能够添加任意数量的ZipCodes,而不必手动调整查询 我已经看过了,但是我不能让它工作 我一直在向sql查询传递值列表。如果我通过一个ZipCode,它就工作了 像这样的东西会帮助我: WHERE ZipCode IN (SELECT * FROM [sheet2$a1:a2]) 但是这打破了查询。这里的一个解决方案是使用OPENROW
ZipCodes
在我的Excel表中有一个值
我希望用户能够添加任意数量的ZipCodes
,而不必手动调整查询
我已经看过了,但是我不能让它工作
我一直在向sql查询传递值列表。如果我通过一个ZipCode,它就工作了
像这样的东西会帮助我:
WHERE ZipCode IN (SELECT * FROM [sheet2$a1:a2])
但是这打破了查询。这里的一个解决方案是使用
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];');
这将返回从列A
到G
的所有行,从第2行开始。假设第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\u vw
,excel文件中的数据位于列A中,两个数据集中的列都称为ZipCode
):
请注意,我在查询中有PRINT
语句这些是你的朋友。我(个人)建议你先注释掉EXEC
语句,然后使用PRINT
语句。检查打印的输出是否正确。如果确实如此,则运行它,如果您遇到错误,则排除来自打印的输出,而不是动态SQL的输出。修复非动态SQL后,将更改传播到动态SQL
希望这能解释一切。如果你有任何问题,请一定要问 这个Excel文档在哪里?它是一个静态文件,还是将由用户“提供”给数据引擎的文件?但我无法让它工作。请告诉我们您尝试了什么以及停留在哪一点。@Larnu该文件将由管理员设置并提供给最终用户。他们应该审查数据,将来可能会添加更多的Zipcode。“提供给最终用户”?那么,它将位于他们的PC上,在他们的电子邮件中?您的SQL Server是否有权访问其本地文件(我假设没有,也不应该)。如果他们正在更新文件,是否会在本地重新保存?您可以使用类似于OPENROWSET
的内容,但文件必须位于SQL Server的服务帐户有权访问的网络位置。@Larnu我将仅为单个视图创建一个新的只读用户。任何人都可以访问服务器。非常感谢!将尝试您的解决方案并给出反馈!
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;
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;