如何在SQL查询中设置的Openrow中选择动态工作表名称?

问题描述

我正在使用以下查询将销售记录excel数据提取sql Server表中。通常,工作表名称保留为“销售记录”,但有时会更改为“工作表”或其他名称

当前,我在查询中提到了静态工作表名称。如何选择一个动态名称,以便即使我的工作表名称更改,我也能够无错误获取数据。

当前情况:

FROM [Sales Register$]'');'

我希望它像:-

FROM [***ANY NAME*** $]'');'

代码

SET @filePath1  = 'D:\.......\Sales_Register_'+ @curDate + '.xlsx'

SET @sql2 = 'INSERT INTO [MyDB].[dbo].[SalesRegister] 
                ([Subsidairy],[Date],[Product],[Quantity],[Rate],[Value]) 
             SELECT 
                    [Subsidairy],[Value]
            FROM OPENROWSET
                (''Microsoft.ACE.OLEDB.12.0'',''Excel 12.0;Database='+@filePath1+';
                    HDR=YES; IMEX=1'',''SELECT 
                    [Subsidairy],[Value]
            FROM [Sales Register$]'');'

解决方法

您可以使用以下代码从excel文档中获取sheet_name。

DECLARE @tempdata TABLE 
(
   TABLE_CAT varchar(50),TABLE_SCHEMA varchar(50),TABLE_NAME varchar(50),TABLE_TYPE varchar(50),TABLE_REMARKS varchar(50)
);
declare @sheet_name nvarchar(100);
declare @linkedServerName sysname = 'TempExcelSpreadsheet'
declare @excelFileUrl nvarchar(1000) = 'D:\opt\Test\Test.xlsx'

if exists(select null from sys.servers where name = @linkedServerName) begin
    exec sp_dropserver @server = @linkedServerName,@droplogins = 'droplogins'
end

exec sp_addlinkedserver
    @server = @linkedServerName,@srvproduct = 'ACE 12.0',@provider = 'Microsoft.ACE.OLEDB.12.0',@datasrc = @excelFileUrl,@provstr = 'Excel 12.0;HDR=Yes'

declare @suser_sname nvarchar(256) = suser_sname()

exec sp_addlinkedsrvlogin
    @rmtsrvname = @linkedServerName,@useself = 'false',@locallogin = @suser_sname,@rmtuser = null,@rmtpassword = null


INSERT INTO @tempdata
exec sp_tables_ex @linkedServerName;

SET @sheet_name=(select top 1 TABLE_NAME from @tempdata)
-- Remove temp linked server
if exists(select null from sys.servers where name = @linkedServerName) begin
    exec sp_dropserver @server = @linkedServerName,@droplogins = 'droplogins'
end

之后,您可以编写代码并使用变量'@sheet_name'代替'[Sales Register $]'。