在 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
语句检查变量的长度,并在没有值时替换 119121
。 LEN
函数在下面对此进行检查,并在 @[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])
在 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
语句检查变量的长度,并在没有值时替换 119121
。 LEN
函数在下面对此进行检查,并在 @[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])