谁能帮我解码 SSIS 派生列中的条件(?)运算符
Can any one help me to decode Conditional(?) Operator in Derived Column of SSIS
我必须在 SQL 查询中解码下面的表达式,但对 SSIS 不太熟悉,所以任何人都可以帮助我解码这个表达式。
D_UPDTD_LOAD_LOG_KEY = CRCTD_LOAD_LOG_KEY > 0 ? FINDSTRING(@[User::LV_LoadLogKey],LTRIM(RTRIM((DT_WSTR,35)CRCTD_LOAD_LOG_KEY)),1) > 0 ? CRCTD_LOAD_LOG_KEY : UPDTD_LOAD_LOG_KEY : UPDTD_LOAD_LOG_KEY
在不知道您不理解表达式的哪些部分的情况下,这个答案有点宽泛,但会告诉您每个部分的作用。然后由您将这些信息放在一起。
首先让我们看一下这个语法:
{Boolean Expression} ? {Scalar Value} : {Scalar Value}
这在 SSIS 中是一个内联 If。它等价于 T-SQL 中的 IIF
(这是一个简短的 CASE
表达式)。简单来说,以下表达式具有可比性:
SomeValue > Another Value ? 1 : 0
IIF(SomeValue > AnotherValue, 1, 0)
CASE WHEN SomeValue > AnotherValue THEN 1 ELSE 0 END
在您的表达式中,您嵌套了内联 ifs,因此简而言之如下所示:
{Boolean Expression 1} ? {Boolean Expression 2} ? {Scalar Value When 1 and 2 are true} : {Scalar Value when 1 is true, 2 is false} : {Scalar Value when 1 is false}
如果有帮助,这里是一个添加了括号的版本,以帮助查看内联 ifs 的开始和结束位置:
({Boolean Expression 1} ? ({Boolean Expression 2} ? {Scalar Value When 1 and 2 are true} : {Scalar Value when 1 is true, 2 is false}) : {Scalar Value when 1 is false})
现在我们来看第二个布尔表达式:
FINDSTRING(@[User::LV_LoadLogKey],LTRIM(RTRIM((DT_WSTR,35)CRCTD_LOAD_LOG_KEY)),1) > 0
这里有几个运算符。首先 (DT_WSTR,35)
将以下表达式(在本例中为 CRCTD_LOAD_LOG_KEY
)转换为长度为 35 的 DT_WSTR
。DT_WSTR
等价于 T-[= 中的 nvarchar
55=]。所以这相当于 T-SQL.
中的 CONVERT(nvarchar(35),CRCTD_LOAD_LOG_KEY)
或 CAST(CRCTD_LOAD_LOG_KEY AS nvarchar(35))
LTRIM
和 RTRIM
与它们的 T-SQL 对应物做同样的事情;他们从字符串中删除前导和尾随的空白字符。
最后你有 FINDSTRING
,相当于 T-SQL 中的 CHARINDEX
。唯一的区别是前 2 个参数是相反的;第一个参数是要在 in 中搜索字符的字符串,第二个参数是要搜索 for 中的字符的字符串。第三个参数也是一样,出现次数。因此,对于 FINDSTRING
的简化版本,以下内容是等效的:
FINSTRING(@[User::LV_LoadLogKey],CRCTD_LOAD_LOG_KEY,1)
CHARINDEX(CRCTD_LOAD_LOG_KEY, @LV_LoadLogKey,1)
我必须在 SQL 查询中解码下面的表达式,但对 SSIS 不太熟悉,所以任何人都可以帮助我解码这个表达式。
D_UPDTD_LOAD_LOG_KEY = CRCTD_LOAD_LOG_KEY > 0 ? FINDSTRING(@[User::LV_LoadLogKey],LTRIM(RTRIM((DT_WSTR,35)CRCTD_LOAD_LOG_KEY)),1) > 0 ? CRCTD_LOAD_LOG_KEY : UPDTD_LOAD_LOG_KEY : UPDTD_LOAD_LOG_KEY
在不知道您不理解表达式的哪些部分的情况下,这个答案有点宽泛,但会告诉您每个部分的作用。然后由您将这些信息放在一起。
首先让我们看一下这个语法:
{Boolean Expression} ? {Scalar Value} : {Scalar Value}
这在 SSIS 中是一个内联 If。它等价于 T-SQL 中的 IIF
(这是一个简短的 CASE
表达式)。简单来说,以下表达式具有可比性:
SomeValue > Another Value ? 1 : 0
IIF(SomeValue > AnotherValue, 1, 0)
CASE WHEN SomeValue > AnotherValue THEN 1 ELSE 0 END
在您的表达式中,您嵌套了内联 ifs,因此简而言之如下所示:
{Boolean Expression 1} ? {Boolean Expression 2} ? {Scalar Value When 1 and 2 are true} : {Scalar Value when 1 is true, 2 is false} : {Scalar Value when 1 is false}
如果有帮助,这里是一个添加了括号的版本,以帮助查看内联 ifs 的开始和结束位置:
({Boolean Expression 1} ? ({Boolean Expression 2} ? {Scalar Value When 1 and 2 are true} : {Scalar Value when 1 is true, 2 is false}) : {Scalar Value when 1 is false})
现在我们来看第二个布尔表达式:
FINDSTRING(@[User::LV_LoadLogKey],LTRIM(RTRIM((DT_WSTR,35)CRCTD_LOAD_LOG_KEY)),1) > 0
这里有几个运算符。首先 (DT_WSTR,35)
将以下表达式(在本例中为 CRCTD_LOAD_LOG_KEY
)转换为长度为 35 的 DT_WSTR
。DT_WSTR
等价于 T-[= 中的 nvarchar
55=]。所以这相当于 T-SQL.
CONVERT(nvarchar(35),CRCTD_LOAD_LOG_KEY)
或 CAST(CRCTD_LOAD_LOG_KEY AS nvarchar(35))
LTRIM
和 RTRIM
与它们的 T-SQL 对应物做同样的事情;他们从字符串中删除前导和尾随的空白字符。
最后你有 FINDSTRING
,相当于 T-SQL 中的 CHARINDEX
。唯一的区别是前 2 个参数是相反的;第一个参数是要在 in 中搜索字符的字符串,第二个参数是要搜索 for 中的字符的字符串。第三个参数也是一样,出现次数。因此,对于 FINDSTRING
的简化版本,以下内容是等效的:
FINSTRING(@[User::LV_LoadLogKey],CRCTD_LOAD_LOG_KEY,1)
CHARINDEX(CRCTD_LOAD_LOG_KEY, @LV_LoadLogKey,1)