简体   繁体   English

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

[英]How to select dynamic sheet Name in Openrow set in SQL query?

I am using the below query to fetch the sales register excel data into a SQL Server table.我正在使用以下查询将销售登记表 excel 数据提取到 SQL Server 表中。 Usually, the sheet name remains as 'Sales Register' but sometimes it changes to 'Sheet' or Some other names.通常,工作表名称仍为“销售登记册”,但有时会更改为“工作表”或其他名称。

Currently, I have mentioned the static sheet name in my query.目前,我在查询中提到了静态工作表名称。 How I can pick a dynamic name so that even if my sheet name changes I shall be able to fetch the data without error.我如何选择一个动态名称,以便即使我的工作表名称发生变化,我也可以毫无错误地获取数据。

Current scenario :当前场景:

FROM [Sales Register$]'');'

I want it to be like:-我希望它像:-

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

Code:代码:

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

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

You can use below code to get sheet_name from excel document.您可以使用以下代码从 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

After that you can write your code and use variable '@sheet_name' instead of '[Sales Register$]'.之后,您可以编写代码并使用变量“@sheet_name”而不是“[Sales Register$]”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM