SQL Server存储过程批量插入多CSV文件到对应表语法报错问题
问题解决
错误原因
- 表名包含特殊字符
-,SQL Server要求包含特殊字符的标识符必须用方括号[]包裹,否则会识别为语法错误。 - 动态生成的
BULK INSERT语句中,文件路径没有用单引号包裹,且末尾多了多余的右括号,直接导致语法报错。 - 代码中存在表名拼写不一致问题,前面操作的是
FileNames表,插入数据时写的是FileName,会导致表找不到或者数据写入失败。 - 没有指定制表符分隔的参数,即使语法修复后插入也会出现字段匹配错误。
修复后的完整代码
DECLARE @filename VARCHAR(255), @path VARCHAR(255), @sql VARCHAR(8000), @cmd VARCHAR(1000) -- 配置文件存储路径 SET @path = 'C:\Temp\CSV_FILES\' SET @cmd = 'dir ' + @path + '*.csv /b' -- 清空文件名记录表 DELETE FROM FileNames -- 读取所有csv文件名写入表(修正表名拼写) INSERT INTO FileNames(FileName) EXEC Master..xp_cmdShell @cmd -- 补全文件路径 UPDATE FileNames SET FilePath = @path WHERE FilePath IS NULL -- 清理空值数据 DELETE FROM FileNames WHERE FileName IS NULL -- 游标循环处理每个文件 DECLARE c1 CURSOR FOR SELECT FilePath, FileName FROM FileNames WHERE FileName LIKE '%.csv%' ORDER BY FileName DESC OPEN c1 FETCH NEXT FROM c1 INTO @path, @filename WHILE @@FETCH_STATUS <> -1 BEGIN -- 修复动态SQL:表名加方括号、路径加单引号、去掉多余右括号、添加制表符分隔配置 SET @sql = 'BULK INSERT [' + REPLACE(@filename, '.csv','') + '] FROM ''' + @Path + @filename + ''' WITH ( FIELDTERMINATOR = ''\t'', -- 指定制表符为字段分隔符 ROWTERMINATOR = ''\n'', -- 指定换行符为行分隔符 TABLOCK )' PRINT @sql -- 打印SQL方便排查问题 EXEC (@sql) FETCH NEXT FROM c1 INTO @path, @filename END CLOSE c1 DEALLOCATE c1
额外注意事项
- 确保每个CSV文件的列顺序、列类型和对应的表结构完全一致,否则会插入失败。
- 确保SQL Server服务的运行账号有读取
C:\Temp\CSV_FILES\目录的权限。 - 如果之前没有开启xp_cmdshell,需要先执行以下语句开启:
sp_configure 'show advanced options', 1 RECONFIGURE sp_configure 'xp_cmdshell', 1 RECONFIGURE
内容的提问来源于stack exchange,提问作者trav1514
相关产品推荐
相关产品推荐

