Sql-Server

SSIS:日期的空值不斷失敗

  • April 15, 2019

我有一個序列容器,在那個序列容器中,我選擇了將數據傳遞到 foreach 循環容器中的選擇。問題出現在日期數據類型的列之一上。當該列中有日期時,它可以正常工作,但是當它為空時,它會失敗。無論如何,這個問題是否存在空值?

在此處輸入圖像描述

這是專欄

[

這是下面的錯誤消息: 在此處輸入圖像描述

下面是我將日期從 null 更改為日期的 sql 語句 SELECT cast(ISNULL([Submitted_Date],'01/01/1900') as datetime) as [Submitted_Date] FROM [dbo].[Application_Tbl] WHERE Application_Form_Id IN (12345) processed = 0

不幸的是,SSIS 變數不能保存NULL值。NULL允許在數據流的列中但不允許在變數中,這是對 SSIS 使用的底層 COM 對象的限制。

您必須通過在查詢中提供預設值或哨兵值來解決此問題,然後檢查該值以正確分配NULL. 您可以更改查詢以提供正確類型的非空值,例如:

SELECT 
   T.Column1,
   T.Column2,
   DateColumn = ISNULL(T.DateColumn, '1900-01-01')
FROM 
   YourTable AS T

然後,每當您在 ForEach 中引用它時DateColumn,請創建一個表達式來檢查該值並替換為NULL.

YEAR( @[User::DateColumn]  ) == 1900 ?  NULL(DT_DATE) : @[User::DateColumn]

如果您使用 ForEach 的變數發出UPDATEviaOLE Command語句,那麼您目前的更新應該類似於:

UPDATE T SET 
   col1 = ?, 
   col2 = ? 
FROM
   yourTableToUpdate T
WHERE
   primaryKeyID = ?

或者也許是一個 SP 呼叫:

EXEC dbo.UpdateSomeTable
   @ID = ?,
   @Col1 = ?,
   @Col2 = ?

您可以使用純 SQL 將值替換回NULL. 我還建議先將值分配給變數,然後在 SQL 中您想要的任何位置使用變數。這樣更容易看到參數分配的正確順序,您也可以毫無困難地重複它們:

DECLARE @col1 DATETIME = ?
DECLARE @col2 VARCHAR(100) = ?
DECLARE @primaryKeyID INT = ?

SET @col1 = CASE WHEN YEAR(@col1) <> 1900 THEN @col1 END

UPDATE T SET 
   col1 = @col1,
   col2 = @col2 
FROM
   yourTableToUpdate T
WHERE
   primaryKeyID = @primaryKeyID

或者:

DECLARE @col1 DATETIME = ?
DECLARE @col2 VARCHAR(100) = ?
DECLARE @primaryKeyID INT = ?

SET @col1 = CASE WHEN YEAR(@col1) <> 1900 THEN @col1 END

EXEC dbo.UpdateSomeTable
   @ID = @primaryKeyID,
   @Col1 = @col1,
   @Col2 = @col2

引用自:https://dba.stackexchange.com/questions/234544