Sql-Server
SSIS:日期的空值不斷失敗
我有一個序列容器,在那個序列容器中,我選擇了將數據傳遞到 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 的變數發出
UPDATE
viaOLE 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