私はシーケンスコンテナーを持っていますが、そのシーケンスコンテナーでは、データをforeachループコンテナーに渡すように選択しています。問題は、日付データ型である列の1つで発生します。その列に日付がある場合は正常に機能しますが、nullの場合は失敗します。とにかく、この問題のnull値に関する問題はありますか?
これがコラムです
以下は、日付を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
を正しく割り当てる必要があります。クエリを変更して、正しいタイプの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