SSIS 合并声明日期时间未更新

Posted

技术标签:

【中文标题】SSIS 合并声明日期时间未更新【英文标题】:SSIS Merge Statment Datetime not updated 【发布时间】:2017-09-18 08:55:13 【问题描述】:

我在我的 SSIS 包中使用 Merge 语句。问题是当我运行包时它不会更新日期时间列。它会正确插入日期时间,但如果源数据库中有新的日期时间可用,它不会将它们从 NULL 更新到某个日期时间。 源和目标都具有相同的列类型 (datetime(2),null)。 我在截断临时表后在 SQL 任务中使用下面的代码。

MERGE abc.dbo.invoices AS targe

USING (SELECT 

   ID      
  ,cash_received_date
  ,schedule_datetime
  ,delivery_date

FROM Staging.dbo.tmpabcinvoices) AS sourc
ON targe.id = sourc.id
WHEN MATCHED and  
targe.schedule_datetime <> sourc.schedule_datetime
or
targe.delivery_date <> sourc.delivery_date
or
targe.cash_received_date <> sourc.cash_received_date

THEN UPDATE SET 
,targe.schedule_datetime=sourc.schedule_datetime
,targe.delivery_date=sourc.delivery_date
,targe.cash_received_date=sourc.cash_received_date

WHEN NOT MATCHED THEN
INSERT(

      old_invoiceid         
      ,cash_received_date
      ,schedule_datetime
      ,delivery_date

)
VALUES
(

      sourc.old_invoiceid
      ,sourc.cash_received_date
      ,sourc.schedule_datetime
      ,sourc.delivery_date

);
GO

【问题讨论】:

【参考方案1】:

你有一个逗号,不应该出现在这一行的开头:

,targe.schedule_datetime=sourc.schedule_datetime

另外,您需要添加它来处理 NULL:

targe.schedule_datetime <> sourc.schedule_datetime
or (targe.schedule_datetime IS NULL AND sourc.schedule_datetime IS NOT NULL)
or targe.delivery_date <> sourc.delivery_date
or (targe.delivery_date IS NULL AND sourc.delivery_date IS NOT NULL)
or targe.cash_received_date <> sourc.cash_received_date
or (targe.cash_received_date IS NULL AND sourc.cash_received_date IS NOT NULL)

虽然 ANSI_NULLS 设置为 ON,但 NULL 基本上是未知数,因此不能将它们评估为“等于”或“不等于”。

【讨论】:

谢谢,帮了大忙。

以上是关于SSIS 合并声明日期时间未更新的主要内容,如果未能解决你的问题,请参考以下文章

SSIS将日期时间变量更改为其他格式

合并到主线程上下文时,在后台线程上下文中更新的可转换属性未保存

如何在 sql server 2008R2/ssis 中为每个日期导出带有日期时间的单独 excel 表?

SSIS将日期时间变量与数据流中的varchar匹配

使用 SSIS 动态文件命名以包含日期和时间

在 SSIS 中将 varchar 数据类型转换为日期时间