[英]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.