是否可以使用 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 值,我需要从中删除数据。

SurveyCodeCSS-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 语句中的参考?的主要内容,如果未能解决你的问题,请参考以下文章

(Excel) 引用另一个工作表中的单元格时,我可以将工作表名称作为单元格值传递吗?

将 Excel 格式化为文本格式

Excel VBA合并单元格值

从 Excel 中的另一个单元格控制单元格值

Excel VBA:用相邻的单元格值填充空单元格

Excel,单元格值更改时不同的行突出显示颜色