How to fix error Incorrect syntax near '+' xp_cmdshell and OPENROWSET

问题描述 投票:0回答:1

第一次发帖,先谢谢大家的帮助。我正在尝试将 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 感到生疏。

sql ssms
1个回答
0
投票

我发现使用 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

https://learn.microsoft.com/en-us/sql/relational-databases/import-export/import-data-from-excel-to-sql?view=sql-server-ver16

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 循环中。

© www.soinside.com 2019 - 2024. All rights reserved.