Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 根据Excel工作表中的值,从SQL Server数据源将数据获取到Excel中_Sql Server_Excel - Fatal编程技术网

Sql server 根据Excel工作表中的值,从SQL Server数据源将数据获取到Excel中

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

假设在我的Excel表格中,我有以下“表格”:

我需要从SQL Server视图中获取数据,其中列
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;