我有一个SSIS包,可以将数据导入SQL Server。我有一个字段,我需要删除所有内容,包括“ - ”。以下是我的脚本:
SELECT LEFT(PartNumber, CHARINDEX('-', PartNumber) - 1)
FROM ExtensionBase
我的问题是,在我的存储过程中,我应该使用此脚本,以便在将数据输入ExtensionBase之前进行切割。我可以在Scalar_Value函数中执行此操作吗?
答案 0 :(得分:6)
您有两条路线可供选择。您可以使用Derived Column
和表达式生成此值或使用脚本转换。一般来说,首先找到一个脚本并不是SSIS中可维护性和性能的好习惯,但另一个经验法则是,如果你没有滚动就看不到整个表达式,那就太多了。
以下是说明这两种方法的示例数据流。
我使用简单的查询来模拟您的源数据。我检查了空字符串,没有短划线的部分号,多个破折号和NULL。
SELECT
D.PartNumber
FROM
(
VALUES
('ABC')
, ('def-jkl')
, ('mn-opq-rst')
, ('')
, ('Previous line missing')
, (NULL)
) D(PartNumber);
我将使用FINDSTRING来确定起点。如果搜索的项目不存在或输入为NULL,则FINDSTRING将返回零。我使用三元运算符来返回第一个破折号的位置,减去占用破折号的空间或者返回源字符串的长度。
(FINDSTRING(PartNumber,"-",1)) > 0
? (FINDSTRING(PartNumber,"-",1)) - 1
: LEN(PartNumber)
我发现在这些情况下首先计算位置然后再尝试使用它们会很有帮助。这样,如果您犯了错误,则无需修复多个公式。
2012年发布的SSIS为我们提供了LEFT功能,而之前的版本用户必须通过SUBSTRING来电。
LEFT表达式为
LEFT(PartNumber,StartOrdinal)
虽然SUBSTRING只是
SUBSTRING(PartNumber,1,StartOrdinal)
这种方法是使用.NET的基本字符串功能来简化生活。 String.Split方法将返回一个字符串数组,而不是我们分割的字符串。由于您只需要第一个东西,即零-eth元素,我们会将其分配给在此任务中创建的SCRPartNumber
列。请注意,我们检查PartNumber
是否为null并在新列上设置null标志。
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;
}
}
您可以看到结果是相同的,但计算它们。