SSIS在运行时更改OLE DB源查询参数数据类型

时间:2017-04-07 08:12:28

标签: sql-server ssis

我希望查询返回昨天的记录,并且如果需要重新加载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

任何可能导致此数据类型查找的想法以及如何稳定行为?

1 个答案:

答案 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字段的类型,然后运行查询以将其与日期时间类型变量进行比较。结果是前一天午夜开始的所有行。