在 ssms 中执行时,VS-2017 SSIS 中评估的变量和成功评估的包不起作用

Evaluated variable and successfully evaluated package in VS-2017 SSIS does not work when executed in ssms

在 VS-2017 中,我编写了一个数据类型为 "string" 的变量。此变量使用另一个变量来确定应该从数据库中提取数据的时间。

手头的问题是表达式在VS中成功求值,ssis包可以成功执行,查询本身可以在ssms中执行。当包部署到 ssms 并在整个集成服务目录中执行时,包不起作用。包在第一个 'or' 语句

处失败

我从执行报告中得到的信息是:

"incorrect syntax near the statement 'or'".

评估值(正确的 sql 查询)在 ssms 中执行时工作正常。 我试图在 'or' 语句之前或之后放置一个空字符串,但没有解决问题。 我试图用 'and' 替换 'or' 语句,但没有用。 在没有 'where' 语句的情况下执行,包按预期工作。 在另一个包中,我无法复制错误

"  select * from src where id >= "+ @[User::MaxIdStr] +" or id >= "+  @[User::MaxIdStr]

错误似乎存在的代码段:

where
[DateUpdated (CCUPMJ)] >= "+ @[User::Max_Upmj_Start]  +" 
or F0911.[DateUpdated (GLUPMJ)] >= "  +  @[User::Max_Upmj_Start]+"
or F560911T.[DateUpdated (GLUPMJ)] >= "+ @[User::Max_Upmj_Start]

在 VS 中它被评估为:

[DateUpdated (CCUPMJ)] >= 119121 

or F0911.[DateUpdated (GLUPMJ)] >= 119121

or F560911T.[DateUpdated (GLUPMJ)] >= 119121

(119121为变量默认值)

预期结果应该是成功执行包,实际结果是执行失败。

如果有人知道如何解决这个问题,我将不胜感激!

包执行时@[User::Max_Upmj_Start]是否被赋值为空字符串或null?使用空字符串变量,我能够重现您收到的相同 "incorrect syntax near the statement 'or'" 错误。由于 119121 是默认值,您可以使用 SSIS IF 语句检查变量的长度,并在没有值时替换 119121LEN 函数在下面对此进行检查,并在 @[User::Max_Upmj_Start] 的长度小于 1 时使用默认值。为了清楚起见,IF 语法显示在示例表达式的正上方多变的。由于这是嵌套的,每个 IF 语句都用括号括起来。我假设您用完整的 SELECT 语句省略了变量的开头,因此此示例仅使用虚拟 SELECT * FROM ... 作为占位符。尽管它包含一个数字,但从您的表达式看来 @[User::Max_Upmj_Start] 似乎是一个字符串变量,下面的示例遵循此假设。请注意,SSIS 变量不保留空值,对于字符串变量,空字符串将被替换,因此使用 REPLACENULL 函数在这里没有帮助。

IF 语法:

Expression ? True Condition : False Condition

变量表达式:

"SELECT * FROM ... WHERE
[DateUpdated (CCUPMJ)] >= " + 
(LEN(@[User::Max_Upmj_Start]) < 1 ? "119121" : @[User::Max_Upmj_Start]) 
+ "OR F0911.[DateUpdated (GLUPMJ)] >=  " + 
(LEN(@[User::Max_Upmj_Start]) < 1 ? "119121" : @[User::Max_Upmj_Start])+ "
OR F560911T.[DateUpdated (GLUPMJ)]  >=  " + 
(LEN(@[User::Max_Upmj_Start]) < 1 ? "119121" : @[User::Max_Upmj_Start])