我有下面的T-SQL查询行,我试图将Visual Studio SSIS表达式转换为派生列任务。
所以tableA
只有[Work item /Submission no#]
列,但是当我执行下面的情况时,我需要将它们分成两个列,如表B中的SubmissionCommon
和SubmissionNumber
。
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
我建议您先添加一个派生列(您可以将其命名为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)
因为第一个可能会抛出错误
有关详细信息,请按照以下文章操作:
根据您的评论,我将提供一些截图
数据流概述
第一个衍生专栏
第一个派生列错误输出配置
第二个派生列
我相信这样的事情对你有用:
(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的精度和比例规格,以满足您自己的要求。
如果你更喜欢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);