我希望查询返回昨天的记录,并且如果需要重新加载x天,将来会变得灵活。因此,项目参数DaysToReload为Int32,值设置为-1。
源查询如下所示:
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似乎设置了?参数到数据类型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服务器版本:10.50.6529.0
SSIS服务器版本:13.0.1601
任何可能导致此数据类型查找的想法以及如何稳定行为?
答案 0 :(得分:1)
我通过移动
来完成这项工作DATEADD(d, convert(int, ?), DATEADD(d,0,DATEDIFF(d,0,GETDATE())))
将WHERE语句的一部分转换为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字段的类型,然后运行查询以将其与日期时间类型变量进行比较。结果是前一天午夜开始的所有行。