您有两条路线可供选择。您可以使用Derived Columns 和表达式来生成此值或使用脚本转换。一般来说,先获取脚本对于 SSIS 中的可维护性和性能来说并不是一个好习惯,但另一个经验法则是,如果不滚动就无法看到整个表达式,那就太多了。
数据流
以下是说明这两种方法的示例数据流。
OLE_SRC
我使用了一个简单的查询来模拟您的源数据。我检查了空字符串、没有破折号的部件号、多个破折号和 NULL。
SELECT
D.PartNumber
FROM
(
VALUES
('ABC')
, ('def-jkl')
, ('mn-opq-rst')
, ('')
, ('Previous line missing')
, (NULL)
) D(PartNumber);
DER 查找破折号位置
我将使用FINDSTRING 来确定起点。如果搜索到的项目不存在或输入为 NULL,则 FINDSTRING 将返回零。我使用三元运算符来返回第一个破折号的位置,减去用于说明破折号的空格,或者返回源字符串的长度。
(FINDSTRING(PartNumber,"-",1)) > 0
? (FINDSTRING(PartNumber,"-",1)) - 1
: LEN(PartNumber)
我发现在这些情况下,先计算位置然后再尝试使用它们很有帮助。这样,如果您犯了错误,您就不必修复多个公式。
DER Trim out dash plus
SSIS 2012 版为我们提供了LEFT 功能,而以前的版本用户必须使用SUBSTRING 调用。
LEFT 表达式是
LEFT(PartNumber,StartOrdinal)
虽然 SUBSTRING 很简单
SUBSTRING(PartNumber,1,StartOrdinal)
SCR 使用网络库
这种方法是利用 .NET 的基本字符串功能让生活更轻松。 String.Split 方法将返回一个字符串数组,减去我们拆分的内容。由于您只需要第一个元素,即零 eth 元素,因此我们将其分配给在此任务中创建的 SCRPartNumber 列。请注意,我们检查PartNumber 是否为空,并在我们的新列上设置空标志。
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (!Row.PartNumber_IsNull)
{
string[] partSplit = Row.PartNumber.Split('-');
Row.SCRPartNumber = partSplit[0];
}
else
{
Row.SCRPartNumber_IsNull = true;
}
}
结果
无论您如何计算,您都可以看到结果是相同的。