2017-04-07 71 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

相关问题