SQL クエリを実行し、クエリの結果を Excel ファイルにエクスポートする基本的な SSIS ジョブがあります。SSIS ジョブは 1 年以上問題なく実行されていますが、今月 (実行前の検証段階で) 次のエラーで失敗し始めました。
「文字列から日時を変換する際に変換に失敗しました。」
SQL クエリ自体は、レコードを収集する開始日と終了日の範囲を指定する WHERE 句を含む単純な SELECT です。日付範囲を決定するクエリの部分は次のとおりです。
DECLARE @RunDateTime datetime
DECLARE @RunDate datetime
DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @Month int
DECLARE @Year int
DECLARE @strStartDate varchar(10)
SET @RunDateTime = GetDate()
SET @RunDate = CAST(@RunDateTime AS DATE)
IF DATEPART(d, @RunDate) = 16
BEGIN
SET @StartDate = DATEADD(d, -15, @RunDate)
SET @EndDate = @RunDate
END
ELSE
BEGIN
IF Month(@RunDate) = 1
SET @Month = 12
ELSE
SET @Month = Month(@RunDate) - 1
IF Month(@RunDate) = 1
SET @Year = Year(@RunDate) - 1
ELSE
SET @Year = Year(@RunDate)
SET @strStartDate = CAST(@Year AS VARCHAR) + CAST(@Month AS VARCHAR) + '16'
SET @StartDate = CONVERT(datetime, @strStartDate)
SET @EndDate = @RunDate
END
このコードを SSIS から取り出して、SSMS 経由でサーバー上で直接実行すると、エラーなく正しく動作します。ただし、SSIS ジョブはそれを実行できません。実際、SQL コマンドの OLE DB ソース オブジェクトに移動して列のメタデータを表示することさえできず、毎回上記のエラーが発生します。
行をコメントアウトするとSET @StartDate = CONVERT(datetime, @strStartDate)
、SSIS でクエリが再び機能することがわかりましたが、この行が問題を引き起こす理由はありません。おっしゃる通り、1年以上問題なく動いています。私は文字通りこれで頭がおかしくなり、なぜ仕事が突然機能しなくなったのか理解できません。
DBA に確認したところ、SQL サーバー側で何も変更されていないことを保証してくれましたが、どこを見ればよいかわかりませんでした。
他の情報:
- SSIS ジョブは SQLNCLI10.1 接続プロバイダーを使用しています。(2008 R2 SQL サーバー)
- 他の接続プロバイダーを使用してみましたが、うまくいきませんでした。
- クエリに含まれる日付列の型は datetime です
- 日付に影響を与える地域/ローカリゼーションの変更はありません。(そして、すべての日付は ISO 形式です)。