web-dev-qa-db-ja.com

SSIS:日付のnull値が失敗し続ける

私はシーケンスコンテナーを持っていますが、そのシーケンスコンテナーでは、データをforeachループコンテナーに渡すように選択しています。問題は、日付データ型である列の1つで発生します。その列に日付がある場合は正常に機能しますが、nullの場合は失敗します。とにかく、この問題のnull値に関する問題はありますか?

enter image description here

これがコラムです

![enter image description here

これは以下のエラーメッセージです: enter image description here

以下は、日付を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

3
Rachel

残念ながら、SSIS変数はNULL値を保持できません。 NULLはデータフローの列では許可されていますが、変数では許可されていません。これは、SSISで使用される基になるCOMオブジェクトの制限です。

これを回避するには、クエリにデフォルト値またはセンチネル値を指定し、後でこの値を確認してNULLを正しく割り当てる必要があります。クエリを変更して、正しいタイプの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の変数を使用してOLE Commandステートメントを介してUPDATEを発行している場合、現在の更新は次のようになります。

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
3
EzLo