0

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 形式です)。
4

1 に答える 1

2

@strStartDate が有効な日付ではないか、認識された形式ではないため、これは失敗します。11 月、12 月、または 1 月に失敗することはありませんが、2 月から 10 月 ( Month(@RunDate) - 1)は間違いなく失敗しCAST(@Month AS VARCHAR)ます。

正直なところ、これは前月の 16 日を計算するのにかなり長い方法です。変更できますか...

DECLARE @StartDate DateTime

IF DATEPART(d, GetDate()) = 16
   SET @StartDate = DateAdd(mm, DateDiff(mm,0,GetDate()),0)
ELSE
   SET @StartDate = DateAdd(mm, DateDiff(mm,0,GetDate())-1,0)+15;

とても簡単

于 2013-01-04T16:50:31.563 に答える