2017-04-07 12 views
1

x日をリロードする必要がある場合、クエリはyesterdaysレコードを返し、将来は柔軟になります。したがって、プロジェクトのパラメータDaysToReloadはInt32で、値は-1に設定されます。SSISは実行時にOLE DBソースクエリパラメータのデータ型を変更します

ソースクエリは次のようになります。

SELECT * FROM State.vStateHourly S 
WHERE S.DateTime >= DATEADD(d, convert(int, ?), DATEADD(d,0,DATEDIFF(d,0,GETDATE()))) 

複数の環境で期待どおりにこれは動作しますが、1つのサイトでの結果は本当に奇妙です。

SQLプロファイラを実行すると、上記のクエリを実行する前に、データ型がS.DateTime列であることが確認されています。ソースクエリ実行前のイベント:

set fmtonly on select S.DateTime from State.vStateHourly S where 1=2 set fmtonly off 

このSSISが設定されているようですか?データDateTime型のパラメータ、トレースに次のイベントがあるので、:

declare @p1 int 
set @p1=5 
exec sp_prepare @p1 output,N'@P1 datetime',N'SET FMTONLY OFF; 
select top 10 * 
FROM 
State.vStateHourly S 

WHERE S.DateTime >= DATEADD(d, convert(int, @P1), DATEADD(d,0,DATEDIFF(d,0,GETDATE())))',1 
select @p1 

が続いている:

exec sp_execute 1,'1899-12-29 00:00:00' 

私は私に利用可能な任意の他の環境では、この動作を観察することはできません。

ソースSQL-Serverのバージョン:10.50.6529.0

SSIS Serverのバージョン:13.0.1601

このデータ型のルックアップを引き起こしている可能性がありますどのような任意のアイデアは、私は挙動を安定できますか?

答えて

0

私は、日付と時刻の変数にWHERE文の

DATEADD(d, convert(int, ?), DATEADD(d,0,DATEDIFF(d,0,GETDATE()))) 

一部を移動することで、この作業を得ました。変数式は次のようになります。DateTime値を作成するために、グローバルDaysToReloadパラメータを使用している

DATEADD("day", @[$Project::DaysToReload] , DATEADD("day", DATEDIFF("day",(DT_DBDATE)("1900-01-01"), GETDATE()), (DT_DBDATE)("1900-01-01"))) 

。それから私はこのように見てしまった元のクエリにこの変数をマッピングされた:

SELECT * FROM State.vStateHourly S 
WHERE S.DateTime >= ? 

今SQLプロファイラは、DBエンジンはS.DateTimeフィールドの型をチェックしていることを示し、その後、日時型にそれを比較するためにクエリを実行します変数。結果は前日の真夜中から始まるすべての行です。

+0

あなたがこの回答を受け入れる必要があります。 – Hadi

関連する問題