如何在SSIS包中从Excel文件名提取日期并为SQL Server目标表添加Extracted_Date列
我来一步步帮你搞定这个需求,其实核心就是从文件名里抠出日期,再把这个日期作为固定列加到每条数据里,具体操作分这几步:
1. 先创建几个关键的SSIS变量
首先你得在SSIS包里新建几个变量,用来存文件名、解析后的日期这些内容:
FileName:字符串类型,用来存储Excel文件的完整路径(如果是批量处理,后续可以通过Foreach循环自动赋值)ExtractedDate:日期类型,用来存储最终解析出来的日期值
2. 从文件名里解析出目标日期
这里推荐用脚本任务来解析,比表达式更灵活,不容易踩格式坑:
- 拖一个脚本任务到控制流面板,在脚本任务编辑器里,把
FileName设为只读变量,ExtractedDate设为可写变量 - 点击“编辑脚本”,用C#写解析逻辑(按你说的规则:
emp_20110909.xls里的11是月份、09是日期、09是年份,也就是最终日期是2009-11-09):
public void Main() { try { // 获取完整文件名(带路径) string fullFileName = Dts.Variables["User::FileName"].Value.ToString(); // 提取纯文件名(去掉路径) string fileNameOnly = System.IO.Path.GetFileName(fullFileName); // 去掉前缀"emp_"和后缀".xls",得到日期字符串"20110909" string datePart = fileNameOnly.Replace("emp_", "").Replace(".xls", ""); // 按规则拆分:年份是最后两位(拼上20前缀)、月份是第3-4位、日期是第5-6位 string year = "20" + datePart.Substring(6, 2); string month = datePart.Substring(2, 2); string day = datePart.Substring(4, 2); // 转成DateTime类型存到变量里 DateTime parsedDate = DateTime.ParseExact($"{year}-{month}-{day}", "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); Dts.Variables["User::ExtractedDate"].Value = parsedDate; Dts.TaskResult = (int)ScriptResults.Success; } catch (Exception ex) { // 抛出错误方便排查 Dts.Events.FireError(0, "日期解析失败", ex.Message, string.Empty, 0); Dts.TaskResult = (int)ScriptResults.Failure; } }
- 保存脚本,关闭编辑器。
3. 搭建数据流任务
接下来在数据流里把日期加到每条数据中:
- 拖一个数据流任务到控制流,和前面的脚本任务连起来(确保先解析日期再处理数据)
- 在数据流面板里:
- 拖Excel源:配置Excel连接管理器,如果是动态文件名,记得把连接字符串绑定到
FileName变量 - 拖派生列组件:连接到Excel源,在派生列编辑器里新增一列,命名为
Extracted_Date,表达式直接写@[User::ExtractedDate],数据类型选和目标表匹配的(比如DT_DATE或者DT_DBTIMESTAMP) - 拖SQL Server目标:连接到你的SQL Server数据库,选择目标表(提前在SQL Server里建好
Extracted_Date列,类型用datetime或者date都可以),然后在“映射”页签里,把派生列的Extracted_Date映射到目标表的对应列
- 拖Excel源:配置Excel连接管理器,如果是动态文件名,记得把连接字符串绑定到
4. 批量处理的补充(如果需要)
如果你要处理多个Excel文件,就在控制流里加一个Foreach循环容器:
- 配置循环容器为“Foreach文件枚举器”,选择存放Excel文件的文件夹,设置文件筛选器为
emp_*.xls - 在“变量映射”里,把遍历到的文件路径赋值给
FileName变量,然后把脚本任务和数据流任务放到循环容器里就行
一些注意事项
- 确保Excel连接管理器的路径是动态的:右键连接管理器→属性→把
ConnectionString表达式绑定到FileName变量 - 如果遇到Excel版本问题(比如.xlsx),记得调整脚本里的扩展名替换逻辑,以及Excel连接管理器的版本
- 测试的时候可以先手动给
FileName变量赋值,跑一次看看日期解析是否正确,再批量运行
内容的提问来源于stack exchange,提问作者Devid Bun
相关产品推荐
相关产品推荐

