SSIS将Recordset Destination输出的Object类型变量转换为Datetime变量的方法
问题1:Object类型结果转换为DateTime类型的实现方案
你存储了单条最大日期记录的Object类型变量,本质是SSIS封装的ADO记录集,不能直接强制类型转换为DateTime,可通过两种路径实现转换:
- 路径1:绕过Recordset Destination,直接在数据流内通过脚本组件将日期值赋值给提前声明的DateTime类型包变量,无需额外转换步骤
- 路径2:保留Recordset Destination的设置,后续通过控制流的Script Task读取记录集内容,提取日期值后赋值给DateTime类型包变量
两种路径最终生成的DateTime类型变量,都可以直接在Execute SQL任务中作为参数使用,参数类型选择DATETIME对应即可。
问题2:数据流任务内脚本组件赋值代码
如果你选择问题1中的路径1,无需再使用Recordset Destination组件,按以下步骤配置即可:
- 提前在包作用域下创建一个DateTime类型的变量,例如
User::MaxBusinessDate - 在数据流中添加脚本组件,类型选择「转换」,将上游输出的仅含最大日期的数据流接入该组件
- 双击打开脚本组件编辑器:
- 在「输入列」页,勾选你的日期字段,用法设置为只读
- 在「脚本」页,将
ReadWriteVariables属性设置为你刚创建的DateTime变量 - 点击「编辑脚本」,替换默认代码为以下内容:
using System; using Microsoft.SqlServer.Dts.Pipeline.Wrapper; using Microsoft.SqlServer.Dts.Runtime.Wrapper; [SSISScriptComponentEntryPointAttribute] public class ScriptMain : UserComponent { private DateTime _maxDate; // 逐行处理输入数据,因仅单条记录只会执行一次 public override void Input0_ProcessInputRow(Input0Buffer Row) { if (!Row.你的日期字段名_IsNull) { _maxDate = Row.你的日期字段名; } } // 所有输入处理完成后给包变量赋值 public override void PostExecute() { base.PostExecute(); Variables.MaxBusinessDate = _maxDate; } }
注意将代码中的
你的日期字段名替换为数据流中对应日期字段的实际名称,MaxBusinessDate替换为你自己创建的DateTime变量名。
问题3:Script Task访问Recordset Destination记录集的代码
如果你需要保留Recordset Destination的配置,按以下步骤实现值的提取:
- 提前在包作用域下创建一个DateTime类型的变量,例如
User::MaxBusinessDate,确认你的Recordset Destination已将结果输出到一个Object类型变量,例如User::DateRecordset - 在数据流任务后添加控制流的脚本任务
- 双击打开脚本任务编辑器:
- 在「脚本」页,将
ReadWriteVariables属性设置为User::DateRecordset,User::MaxBusinessDate - 点击「编辑脚本」,替换默认代码为以下内容:
- 在「脚本」页,将
using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Data.OleDb; namespace ST_自动生成的脚本命名空间 { [SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : VSTARTScriptObjectModelBase { public void Main() { var resultDt = new DataTable(); using (var adapter = new OleDbDataAdapter()) { // 将Object变量存储的记录集填充到DataTable adapter.Fill(resultDt, Dts.Variables["User::DateRecordset"].Value); } // 提取第一条记录的第一列值作为日期结果 if (resultDt.Rows.Count > 0 && resultDt.Rows[0][0] != DBNull.Value) { Dts.Variables["User::MaxBusinessDate"].Value = Convert.ToDateTime(resultDt.Rows[0][0]); } Dts.TaskResult = (int)ScriptResults.Success; } } }
如果你的Recordset包含多列,可将
resultDt.Rows[0][0]修改为resultDt.Rows[0]["你的日期列名"]来指定取值列。
内容的提问来源于stack exchange,提问作者Raja
相关产品推荐
相关产品推荐

