[英]Is it possible to use excel cell value - as a reference in T-SQL statement?
我在 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 语句中?
我认为
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+'%'
要读取 xlsx 文件,首先您需要安装正确的提供程序,您可以通过以下方式进行检查:
USE [master];
EXEC sys.sp_enum_oledb_providers;
您应该会看到 Microsoft.ACE.OLEDB.XX.0,其中 XX 通常可以是 12 或 16。如果您没有看到它,则需要安装提供程序。 在这里从 MS 找到它。
然后,您需要启用“Ad Hoc Distributed Queries”。 您可以通过运行来检查它:
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+'%'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.