在存储过程中正确使用字符串函数

时间:2014-01-25 00:42:08

标签: sql-server function tsql stored-procedures ssis

我有一个SSIS包,可以将数据导入SQL Server。我有一个字段,我需要删除所有内容,包括“ - ”。以下是我的脚本:

SELECT LEFT(PartNumber, CHARINDEX('-', PartNumber) - 1)
FROM ExtensionBase

我的问题是,在我的存储过程中,我应该使用此脚本,以便在将数据输入ExtensionBase之前进行切割。我可以在Scalar_Value函数中执行此操作吗?

1 个答案:

答案 0 :(得分:6)

您有两条路线可供选择。您可以使用Derived Column和表达式生成此值或使用脚本转换。一般来说,首先找到一个脚本并不是SSIS中可维护性和性能的好习惯,但另一个经验法则是,如果你没有滚动就看不到整个表达式,那就太多了。

的数据流

以下是说明这两种方法的示例数据流。

enter image description here

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修剪破折号加

2012年发布的SSIS为我们提供了LEFT功能,而之前的版本用户必须通过SUBSTRING来电。

LEFT表达式为

LEFT(PartNumber,StartOrdinal)

虽然SUBSTRING只是

SUBSTRING(PartNumber,1,StartOrdinal)

SCR使用网络库

这种方法是使用.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;
    }
}

结果

您可以看到结果是相同的,但计算它们。

enter image description here