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

时间:2019-05-07 12:01:44

标签: sql sql-server ssis visual-studio-2017 ssms

在VS-2017中,我编写了一个数据类型为“字符串”的变量。该变量使用另一个变量来确定应从何时开始从数据库中提取数据。

当前的问题是表达式可以在VS中成功计算,ssis包可以成功执行,查询本身可以在ssms中执行。当将软件包部署到ssms并在整个Integration Service Catalog中执行时,该软件包将不起作用。程序包在第一个“或”语句处失败

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

  

“语句'or'附近的语法不正确”。

在ssms中执行时,评估值(正确的sql查询)可以正常工作。 我试图在'or'语句之前或之后放置一个空字符串,但无法解决问题。 我试图用'or'代替'and'语句,但是没有用。 在不使用'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是变量的默认值)

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

如果有人知道如何解决这个问题,我将非常优雅!

1 个答案:

答案 0 :(得分:2)

在软件包执行期间,@[User::Max_Upmj_Start]是否被分配了空字符串或null?使用空字符串变量,我能够在收到的语句“ or”附近重现相同的“语法不正确”。由于119121是默认值,因此您可以使用SSIS IF语句检查变量的长度,并在没有值时替换119121LEN函数在下面进行检查,并在@[User::Max_Upmj_Start]的长度小于1时使用默认值。为清楚起见,IF语法显示在此示例表达式的正上方变量。由于此嵌套,每个IF语句都用括号括起来。我假设您使用完整的SELECT语句省略了变量的开头,因此本示例仅使用伪SELECT * FROM ...作为占位符。尽管它包含一个数字,但从您的表达式来看,@[User::Max_Upmj_Start]似乎是一个字符串变量,下面的示例遵循此假设。请注意,SSIS变量不保留null,对于字符串变量,将使用空字符串代替它,因此在此处使用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])