在VS-2017中,我已经用数据类型"字符串"编写了一个变量。该变量使用另一个变量,以确定应从什么时间从数据库中提取的时间。
当前的问题是,该表达式已在VS中成功评估,可以成功执行SSIS软件包,并且可以在SSM中执行查询本身。当软件包部署到SSM并在整个集成服务目录中执行时,软件包不起作用。该软件包在第一个"或"语句中失败
我从执行报告中收到的消息说:
"语句附近的不正确语法"或"。
在SSMS中执行时,评估的值(正确的SQL查询(正常工作。我试图在'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]
是被分配为空字符串还是空?使用一个空字符串变量,我能够复制您收到的相同的"语句附近的错误语法"或您收到的错误。由于119121
是默认值,因此您可以使用SSIS IF
语句检查变量的长度,并在没有值时替换119121
。LEN
函数检查以下内容,并在@[User::Max_Upmj_Start]
的长度小于1时使用默认值。为了澄清,IF
语法在此变量的示例表达式上方显示。由于将其嵌套为嵌套,每个IF
语句都包裹在括号中。我假设您使用完整的SELECT
语句省略了变量的开头,因此此示例只是使用一个虚拟选择 *作为占位符。即使它拥有一个数字,从您的表达式中,@[User::Max_Upmj_Start]
似乎是字符串变量,下面的示例遵循此假设。请注意,SSIS变量不持有空,并且对于字符串变量,将代替一个空字符串,因此使用REPLACENULL
函数在这里不会有帮助。
如果语法:
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])