如何实现文件名动态变化的CSV文件自动上传至SQL Server?
解决方案
以下两种方案都可以满足你的需求,可根据自己的操作习惯选择:
方案1:SQL端动态拼接BULK INSERT(无需额外写批处理)
直接在SQL Server中创建定时执行的存储过程,自动拼接当日对应的文件名:
CREATE PROCEDURE DailyBulkInsert AS BEGIN DECLARE @dateStr VARCHAR(8) -- 生成MMDDYYYY格式的日期串,SQL Server 2012及以上版本可用FORMAT SET @dateStr = FORMAT(GETDATE(), 'MMddyyyy') -- 低于2012版本用下面这行替换上面的SET语句 -- SET @dateStr = RIGHT('0'+CAST(MONTH(GETDATE()) AS VARCHAR),2) + RIGHT('0'+CAST(DAY(GETDATE()) AS VARCHAR),2) + CAST(YEAR(GETDATE()) AS VARCHAR) -- 替换为你实际的文件路径、后缀、目标表名、导入参数 DECLARE @fullFilePath VARCHAR(200) = 'C:\upload_files\' + @dateStr + 'file.csv' DECLARE @sql NVARCHAR(MAX) SET @sql = N' BULK INSERT 你的目标表名 FROM ''' + @fullFilePath + ''' WITH ( FIELDTERMINATOR = '','', -- 字段分隔符,制表符改为\t ROWTERMINATOR = ''\n'', -- 行分隔符 FIRSTROW = 2 -- 第一行是表头则设为2,否则设为1 )' EXEC sp_executesql @sql END
后续配置:
- 打开SQL Server代理,新建每日定时执行的作业,作业步骤选择执行上面创建的
DailyBulkInsert存储过程即可 - 注意SQL Server的运行服务账号需要有文件存放目录的读取权限
方案2:Windows批处理+任务计划(无需配置SQL Server代理)
就算你不熟悉命令提示符也可以直接用,复制修改几个参数即可:
- 把以下内容复制到记事本,修改对应参数后保存为后缀为
.bat的文件:
@echo off :: 生成MMDDYYYY格式日期,默认适配中文Windows的yyyy-mm-dd/yyyy/mm/dd日期格式 set "dateStr=%date:~5,2%%date:~8,2%%date:~0,4%" :: 替换为实际的文件路径和后缀 set "fullFilePath=C:\upload_files\%dateStr%file.csv" :: 替换为你的SQL实例名、数据库名、目标表名、导入参数 :: 用SQL账号登录用下面这行,替换对应的用户名密码 sqlcmd -S 你的SQL实例名 -U 用户名 -P 密码 -d 数据库名 -Q "BULK INSERT 你的目标表名 FROM '%fullFilePath%' WITH (FIELDTERMINATOR=',', ROWTERMINATOR='\n', FIRSTROW=2)" :: 用Windows身份验证登录SQL用下面这行,删掉上面那行即可 :: sqlcmd -S 你的SQL实例名 -E -d 数据库名 -Q "BULK INSERT 你的目标表名 FROM '%fullFilePath%' WITH (FIELDTERMINATOR=',', ROWTERMINATOR='\n', FIRSTROW=2)"
- 打开Windows自带的「任务计划程序」,创建每日定点触发的任务,操作项设置为启动你刚才保存的bat文件即可
- 注意运行任务的Windows账号需要同时拥有文件读取权限和SQL Server的访问权限
- 如果系统日期格式特殊,可在CMD中执行
echo %date%查看输出结构,调整%date:~x,y%中的偏移量即可适配
常见问题排查
- 执行失败优先检查文件路径是否正确、对应账号的访问权限是否足够、导入参数和文件格式是否匹配
- 如果当日文件可能延迟生成,可以给定时任务加5-10分钟的延迟触发
内容的提问来源于stack exchange,提问作者sprite
相关产品推荐
相关产品推荐

