在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是变量的默认值)
预期结果应该是成功执行的程序包,实际结果是失败的执行程序。
如果有人知道如何解决这个问题,我将非常优雅!
答案 0 :(得分:2)
在软件包执行期间,@[User::Max_Upmj_Start]
是否被分配了空字符串或null?使用空字符串变量,我能够在收到的语句“ or”附近重现相同的“语法不正确”。由于119121
是默认值,因此您可以使用SSIS IF
语句检查变量的长度,并在没有值时替换119121
。 LEN
函数在下面进行检查,并在@[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])