是否可以使用 excel 单元格值 - 作为 T-SQL 语句中的参考?
Posted
技术标签:
【中文标题】是否可以使用 excel 单元格值 - 作为 T-SQL 语句中的参考?【英文标题】:Is it possible to use excel cell value - as a reference in T-SQL statement? 【发布时间】:2020-10-04 08:35:29 【问题描述】:我在 SSMS (SQL Server Management Studio) 中有表:
根据SurveyCode
值,我需要从中删除数据。
SurveyCode
值 CSS-2020-08-
的文本部分存储在 Excel 工作表中,在 B4
单元格中,文件名 Survey.xlsx
:
并且,为了在我的Survey
表中删除/添加新数据,我使用以下代码:
DELETE FROM [WH].[Fact].[Survey]
WHERE [WH].[Fact].[Survey].[SurveyCode] NOT LIKE '%2020-08%'
INSERT INTO
[WH].Fact.[Survey] (
[SurveyCode]
,[SurveyDate]
,[Gender]
,[Age]
,[Questions]
,[Rating]
,[Score]
)
SELECT
staged.[SurveyCode]
,staged.[SurveyDate]
,staged.[Gender]
,staged.[Age]
,staged.[Question]
,staged.[Rating]
,staged.[Score]
FROM
[WH-SSIS].[WHCSS].[Staged_Survey] staged;
是否可以——而不是使用 SQL 语句:
WHERE [WH].[Fact].[Survey].[SurveyCode] NOT LIKE '%2020-08%'
直接从 Excel 电子表格引用 CSS-2020-08-
- 就在 SQL 语句中?
【问题讨论】:
这能回答你的问题吗? Code to read xlsx sheet into a table in a SQL Server database 由一个单元格组成的集合是有效集合。 那么put that range in the query? @GSerg Openrowset 适用于 FROM 子句(使用 select from)但在我的情况下,我需要 WHERE 子句的东西......我认为 Openrowset 不适用于 WHERE Openrowset 不插入任何内容。 Openrowset 允许您读取 Excel 单元格。您指定要读取的单元格。 【参考方案1】:我认为
declare @parameter nvarchar(50)
SELECT parameter =f2
FROM OPENROWSET(
'Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=NO;Database=T:\temp\Survey.xlsx',
'select f2 from [sheet1$] where f1='''SurveyCode'''')
那么你就可以使用参数了
WHERE [WH].[Fact].[Survey].[SurveyCode] NOT LIKE '%'+@parameter+'%'
【讨论】:
【参考方案2】:要读取 xlsx 文件,首先您需要安装正确的提供程序,您可以通过以下方式检查:
USE [master];
EXEC sys.sp_enum_oledb_providers;
您应该会看到 Microsoft.ACE.OLEDB.XX.0,其中 XX 通常可以是 12 或 16。如果您没有看到它,那么您将需要安装提供程序。从 MShere 找到它。
然后,您需要启用“即席分布式查询”。您可以通过运行来检查它:
EXEC sys.sp_configure 'Ad Hoc Distributed Queries';
如果上面的命令不起作用并且您是管理员,那么您将需要运行以下命令:
USE [master];
EXEC sys.sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sys.sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
检查更多设置也很好:
USE master;
EXEC dbo.sp_MSset_oledb_prop;
请参阅此示例中 Microsoft.ACE.OLEDB.16.0 的 allow_in_process 和 dynamic_parameters 值。如果它们为 0,您还需要启用它们:
USE master;
EXEC dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0', N'AllowInProcess', 1;
EXEC dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0', N'DynamicParameters', 1;
经过以上所有检查,请确保运行 SSMS 的用户对您要读取的 xlsx 文件具有读取权限。
最后,您应该能够毫无问题地运行如下查询:
DECLARE @parameter NVARCHAR(50);
SELECT @parameter = F2
FROM OPENROWSET(
'Microsoft.ACE.OLEDB.16.0',
'Excel 8.0;HDR=NO;Database=D:\temp\Survey.xlsx',
'select * from [sheet1$]') AS xlsx
WHERE xlsx.F1 = 'SurveyCode';
您可以在查询中使用@parameter 值:
...NOT LIKE '%'+@parameter+'%'
【讨论】:
另一个问题 - 你的代码中的 F2 和 F1 是什么?以上是关于是否可以使用 excel 单元格值 - 作为 T-SQL 语句中的参考?的主要内容,如果未能解决你的问题,请参考以下文章