【问题标题】:Properly Using String Functions in Stored Procedures在存储过程中正确使用字符串函数
【发布时间】:2014-02-16 04:16:33
【问题描述】:

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

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

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

【问题讨论】:

  • 当您插入数据时,只需使用此函数传递值,这些值将在运行时被修剪,并且只插入想要的字符串。
  • 为什么不在 SSIS 的派生列组件中创建子字符串?

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


【解决方案1】:

您有两条路线可供选择。您可以使用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;
    }
}

结果

无论您如何计算,您都可以看到结果是相同的。

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 2017-10-25
    • 2016-02-18
    • 1970-01-01
    • 2011-07-13
    • 2017-09-04
    • 2015-12-30
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多