SQL脚本到SSIS表达式

问题描述 投票:2回答:3

我有下面的T-SQL查询行,我试图将Visual Studio SSIS表达式转换为派生列任务。

所以tableA只有[Work item /Submission no#]列,但是当我执行下面的情况时,我需要将它们分成两个列,如表B中的SubmissionCommonSubmissionNumber

CASE 
    WHEN ISNUMERIC(SUBSTRING([Work item /Submission no#], 4, 2)) = 1
       THEN LEFT([Work item /Submission no#], 15)
       ELSE LEFT([Work item /Submission no#], 16)
END AS SubmissionCommon,
[Work item /Submission no#] AS SubmissionNumber
sql sql-server ssis expression etl
3个回答
1
投票

Solution

我建议您先添加一个派生列(您可以将其命名为IsNumeric),并使用以下表达式:

(DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) == (DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) ? 1 : 0

然后在“派生列转换编辑器”窗口底部附近,单击“配置错误输出”。你需要告诉SSIS在Error上忽略失败

使用以下表达式添加另一个派生列连接到第一个派生列

REPLACENULL([IsNumeric],0) == 1 ? LEFT([Work item /Submission no#], 15) : LEFT([Work item /Submission no#], 16)

因为第一个可能会抛出错误

有关详细信息,请按照以下文章操作:

Update 1 - Screenshots

根据您的评论,我将提供一些截图

数据流概述

enter image description here

第一个衍生专栏

enter image description here

第一个派生列错误输出配置

enter image description here

第二个派生列

enter image description here


1
投票

我相信这样的事情对你有用:

(DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) == 
(DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) ? 
LEFT([Work item /Submission no#], 15): 
LEFT([Work item /Submission no#], 16)

尝试格式化此站点,但您可能必须删除一些返回。这应该将您的列转换为数字并将其与自身进行比较(因此,如果转换失败,它将为NULL且不相等)。

编辑:这是格式化的字符串:

(DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) == (DT_NUMERIC, 18, 2)SUBSTRING([Work item /Submission no#], 4, 2) ? LEFT([Work item /Submission no#], 15): LEFT([Work item /Submission no#], 16)

您可能还需要匹配DT_NUMERIC的精度和比例规格,以满足您自己的要求。


1
投票

如果你更喜欢c#script组件(确保添加输入和输出列):

string test = Rows.YourRowToTest;
int someNum; //catches output

Row.ColumnName = int.TryParse(test.Substring(4,2),out someNum) == false
                 ?test.Substring(1, 16)
                 :test.Substring(1, 15);
© www.soinside.com 2019 - 2024. All rights reserved.