第一次发帖,先谢谢大家的帮助。我正在尝试将 XLSX 文件直接动态地导入到 SQL Server 数据库中。 XLSX 文件名用于创建表名,第一个工作表中的第一行用于生成列名。 目标是将接收到的原始数据加载到表中,然后利用转换逻辑将原始数据符合正确的结构,并将其放置在可以报告和再次导出的最终表中。
此原始数据将始终以 xlsx 格式接收,但是每次导入时列名都会略有变化。
这是使用 xp_cmdshell 和 openrowset,我的这些行的 sql 是 -
INSERT INTO @files (FilePath)
EXEC xp_cmdshell 'DIR ' + QUOTENAME(@folderPath, '''') + '*.xlsx /B /A:-D'
和
INSERT INTO #tempTable (ColumnName, ColumnData)
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=' + QUOTENAME(@filePath, '''') + ';HDR=YES', 'SELECT * FROM [Sheet1$]')
导入/导出向导似乎一次只允许一个 xlsx 文件,因此我需要使用 T-SQL 来实现一致且直观的方法
当我尝试运行我的脚本时,我在这两行上都遇到了同样的语法错误
“‘+’附近的语法不正确。”
我试图用 concat() 解决这个问题,但我不相信 xp_cmdshell 或 OPENROWSET 会起作用。
我曾尝试使用 ChatGPT 来纠正我的错误,但它似乎无法确定此脚本报告语法错误的原因。
谢谢,我以前从未尝试过这个概念,对我的 SQL 感到生疏。
我发现使用 OpenRowSet 之类的东西最好继续为整个字符串创建一个变量。像这样的东西:
set @Str = 'DIR ' + QUOTENAME(@folderPath, '''') + '*.xlsx /B /A:-D'
EXEC xp_cmdshell @str
但是,我不确定你为什么需要使用 xp_cmdshell。我相信您可以做我在导入数据库图表的 jpeg 时所做的同样的事情。当然,对于 xlsx 文件,你必须稍微修改它,但概念应该是相同的。
truncate table dbd.DictionaryDiagrams--Just getting the diagram names into a table
insert into dbd.DictionaryDiagrams(DiagramName, MimeType)
select name DiagramName, 'image/jpeg' MimeType from dbo.sysdiagrams;
---Loop through all the names and import the jpegs
declare c cursor for
select DiagramName from dbd.DictionaryDiagrams
open c
declare @Path nvarchar(500), @Directory nvarchar(30), @Diagram
nvarchar(200), @sql nvarchar(max)
set @Directory = '\\ServerName\DictionaryDiagrams\'
fetch next from c into @Diagram
set @Path = @Directory + @Diagram + '.jpg'
set @sql = 'update dbd.DictionaryDiagrams set Diagram = ' +
'(select * from openrowset(bulk N''' + @Path + ''', Single_blob) as
Diagram) ' + 'where DiagramName = ''' + @Diagram + '''' + ';'
exec (@sql)
while @@fetch_status = 0
begin
fetch next from c into @Diagram
set @Path = @Directory + @Diagram + '.jpg'
set @sql = 'update dbd.DictionaryDiagrams set Diagram = ' +
'(select * from openrowset(bulk N''' + @Path + ''', Single_blob) as
Diagram) ' + 'where DiagramName = ''' + @Diagram + '''' + ';'
exec (@sql)
end
close c
deallocate c
USE ImportFromExcel;
GO
SELECT * INTO Data_dq
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0; Database=C:\Temp\Data.xlsx', [Sheet1$]);
GO
在尝试获取所有文件之前,先让其中一个工作。然后你可以把它们全部放在一个 while 循环中。