2017-04-07 72 views
1

如果需要重新加載x天,我希望查詢返回昨天的記錄,並且在將來會靈活。因此,項目參數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()))) 

可正常工作在多種環境中,但在一個網站上的結果是很奇怪的。

運行SQL事件探查器時,我發現它正在執行上述查詢之前檢查S.DateTime列的數據類型。源查詢執行前的事件是:

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

在此SSIS似乎設置?參數的數據類型的日期時間,因爲在跟蹤下列事件:隨後是

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服務器版本:13.0.1601

任何想法可能會導致這種數據類型查找,我怎麼能穩定的行爲?

回答

0

我在WHERE語句的

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

部分移動到一個DateTime變量得到了這個工作。變量表達式如下所示:

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

它使用全局DaysToReload參數來創建DateTime值。然後,我映射該變量原來的查詢從而結束這樣看:

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

現在SQL事件探查表明,該數據庫引擎是S.DateTime場的檢查類型,然後運行查詢比較它的datetime型變量。結果是前一天午夜開始的所有行。

+0

即使是你的,你也必須接受這個答案 – Hadi

相關問題