我有一个 SSIS 包,我希望在包执行中的某个点存储日期时间戳,即该点的确切日期和时间,并将其存储在 SQL Server 表中
我在目标表中有一个日期时间列,包连接并可以写入表,因为我已经这样做了,日期时间戳现在是一个添加的列。我有一个带有 SQL 的“执行 SQL 任务”并已配置 - 图像显示正在使用的 SQL 任务和 SSIS 包变量
第二个“执行 SQL 任务”处理插入,我知道它之前可以工作,但现在由于插入了新的日期时间列而失败。错误是
错误:执行查询“INSERT INTO dbo.theTable (”失败,并出现以下错误:“参数绑定 1 上不支持的数据类型。”。可能的失败原因:查询出现问题、“ResultSet”属性设置不正确、参数不正确设置正确
第二个SQL任务中的数据类型我已经尝试了所有日期选项并将参数大小从21增加到23然后是27,但仍然失败。我已使用断点来检查 StoredStartTime 变量,它看起来正确,即 10/10/2023 14.35,尽管没有微秒。请问为什么会失败?
在等待详细信息时,我的解决方案是使用
DATE
数据类型作为 SQL Server RDBMS 的 OLE DB 连接管理器。是的,DATE,尽管它有时间成分。这是一个可怕的名字,令人震惊。
两个变量,都设置为 2111 年,这样我们就可以验证运行时正在使用其他东西。
为 POC 创建表。
DROP TABLE IF EXISTS dbo.SO_77266997;
CREATE TABLE dbo.SO_77266997
(
PackageName varchar(50) NOT NULL
, ServerName varchar(50) NOT NULL
, StartTime datetime2(7) NOT NULL
);
运行查询以获取数据库的当前时间。将其存储到我们的
StoredStartTime
变量
使用 OLE DB 参数化的沼泽标准插入语句(?作为占位符,基于 0 的编号)导致
StoredStartTime
存储到我们的表中
我的顺序位置与你的不同,但只要情况一致,你就会没事的。
此查询只是拉回我们存储的值,以证明尽管数据类型为“DATE”,但我们没有截断时间部分。将值存储到我们的变量中
RetrievedStoredStartTime
我最喜欢的小脚本,因为它将变量值弹出到输出日志中,我们可以在第一张图片中看到结果。
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_0371ffe3d696471a9d92b91f6527ac90
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
bool fireAgain = false;
foreach (var item in Dts.Variables)
{
Dts.Events.FireInformation(0, "SCR echo back", string.Format("{0}=>{1}", item.QualifiedName, item.Value), "", 0, ref fireAgain);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
}