如何在SSIS中将Excel列标题上方注释设为数据库列描述?
提取Excel注释行作为SSIS中数据库列描述的解决方案
核心思路
通过读取Excel标题上方的注释行,将注释内容存入SSIS变量,再调用SQL系统存储过程sp_updateextendedproperty更新数据库表的列描述。数据流任务无法直接执行SQL脚本,需结合控制流的执行SQL任务完成操作。
方案一:数据流任务读取注释行 + 执行SQL任务更新描述
1. 配置数据流任务读取注释行
- 在控制流中新增数据流任务,专门处理注释行的读取工作
- 配置Excel源:
- 数据访问模式选择「SQL命令」,执行SQL语句仅读取第一行注释:
SELECT * FROM [Sheet1$A1:C1]
- 数据访问模式选择「SQL命令」,执行SQL语句仅读取第一行注释:
- 添加脚本组件(转换类型),将注释值赋值给提前创建的变量:
- 在脚本组件的「ReadOnlyVariables」中选择Excel源输出的列
- 编写脚本逻辑,去除注释首尾的
[]后存入对应变量(如@User::EntCodeDesc、@User::EntShortNameDesc、@User::EntNameDesc)public override void ProcessInputRow(Input0Buffer Row) { Dts.Variables["User::EntCodeDesc"].Value = Row.Column0.ToString().Trim('[', ']'); Dts.Variables["User::EntShortNameDesc"].Value = Row.Column1.ToString().Trim('[', ']'); Dts.Variables["User::EntNameDesc"].Value = Row.Column2.ToString().Trim('[', ']'); }
2. 用执行SQL任务更新列描述
- 在控制流中,将执行SQL任务放在数据流任务之后
- 连接目标数据库,设置SQL语句为调用
sp_updateextendedproperty:-- 更新EntCode列描述 EXEC sp_updateextendedproperty @name = N'MS_Description', @value = ?, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'YourTargetTable', @level2type = N'COLUMN', @level2name = N'EntCode'; -- 更新EntShortName列描述 EXEC sp_updateextendedproperty @name = N'MS_Description', @value = ?, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'YourTargetTable', @level2type = N'COLUMN', @level2name = N'EntShortName'; -- 更新EntName列描述 EXEC sp_updateextendedproperty @name = N'MS_Description', @value = ?, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'YourTargetTable', @level2type = N'COLUMN', @level2name = N'EntName'; - 在「参数映射」中,将之前的变量依次映射到SQL语句中的问号占位符(参数索引从0开始)
方案二:脚本任务直接读取Excel注释(更简洁)
跳过数据流任务,直接用脚本任务读取Excel第一行,再调用执行SQL任务:
- 在控制流中新增脚本任务,配置变量为可写状态
- 编写C#脚本读取Excel第一行注释:
using System.Data.OleDb; public void Main() { string excelPath = @"C:\YourExcelFile.xlsx"; string connStr = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelPath};Extended Properties=\"Excel 12.0 Xml;HDR=NO\""; using (OleDbConnection conn = new OleDbConnection(connStr)) { conn.Open(); OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$A1:C1]", conn); var reader = cmd.ExecuteReader(); if (reader.Read()) { Dts.Variables["User::EntCodeDesc"].Value = reader[0].ToString().Trim('[', ']'); Dts.Variables["User::EntShortNameDesc"].Value = reader[1].ToString().Trim('[', ']'); Dts.Variables["User::EntNameDesc"].Value = reader[2].ToString().Trim('[', ']'); } } Dts.TaskResult = (int)ScriptResults.Success; } - 后续步骤同方案一的「执行SQL任务更新列描述」
注意事项
- 确保Excel驱动(ACE OLEDB 12.0)与SSIS运行环境(32/64位)匹配,若使用32位驱动,需在项目属性中设置「Run64BitRuntime」为False
- 处理注释中的特殊字符(如单引号)时,优先使用参数化SQL(即方案中的参数映射方式),避免SQL注入风险
- 若列数较多,可在脚本中动态生成
sp_updateextendedproperty的执行语句,减少重复代码
内容的提问来源于stack exchange,提问作者Paul Wilson
相关产品推荐
相关产品推荐

