OLE DB源中子句中参数乘以负值的问题

时间:2011-09-23 01:49:47

标签: sql-server ssis

我在OLE DB源中使用其中的参数进行了此查询:

select *
from A
where A.A_DATE >= DATEADD(d,-1*(CAST(? as int)),GETDATE())

使用参数X.对于示例案例,我使用X = 1.如果我在SQL Server Management Studio中运行上述查询,它将返回一行(正确的一行)。但是当我在SSIS包中运行它时,它不会返回任何行(这是不正确的)。当删除-1 * xxx并直接使用CAST(?as int)时(查询如下所示):

select *
from A
where A.A_DATE >= DATEADD(d,CAST(? as int),GETDATE())

并将X值设置为-1,它显示正确的结果(返回一行)。 OLE DB源查询中的参数乘法与否定值有什么问题吗?

更新1: 似乎第二个查询还有另一个问题,就好像我将值更改为1,我仍然得到行结果(当它不应该时)。任何解决方案??

更新2: 似乎使用的演员解决方案也存在缺陷,因为它也没有返回正确的值。当我只返回1行

时,我不断返回2行

似乎上面的查询在SSIS中也有缺陷,所以我决定使用这个查询,所以我不必使用CAST:

"select *
from A
where A.A_DATE >= DATEADD(d," + @[User::Y] + ",GETDATE())"

并将其放入变量(我们称之为Src_Query),然后将上面的字符串作为Expression进行评估。我还使用了String数据类型的变量Y而不是我以前使用的数据类型Int32的X,并将其变为负值我只使用了Script Task来处理它。然后在OLE DB源中我使用了“来自变量的SQL命令”选项。我运行包,查询返回正确的结果。它对我在子查询中使用的变量也很有用。

上述解决方案的问题:在我的项目中,我有一些源查询超过4000个字符,而SSIS不允许在表达式生成器中处理超过4000个字符。还在寻找解决这个问题的方法。

更新1:我通过在数据检索后将where子句放在单独的条件分割中来解决我的问题超过4000个chars-long查询,我仍然可以使用我的Int32类型变量。

这是条件拆分使用的表达式,OLE DB Source中的查询不再具有与日期相关的where子句:

A_DATE >= DATEADD("d",@[User::X],(DT_DBDATE)GETDATE())

不知道它会如何影响性能,是否有意义?

0 个答案:

没有答案