【问题标题】:Remove Text from a String in SSIS derived column从 SSIS 派生列中的字符串中删除文本
【发布时间】:2015-10-08 16:09:09
【问题描述】:

我正在尝试从入站数据中删除一些不需要的文本值。接收到的数据如下:

string;#0 Day(s), 08  Hours,  15  Minutes

我在派生列转换中应用了这个:

SUBSTRING([Modified By], FINDSTRING([Modified By],"#",1) + 1, FINDSTRING([Modified By],"#", 1))

只获取#之后的内容

结果是:0 Day(s) 但你看我错过了其余的,我试图在# 之后得到所有东西 => 0 Day(s), 08 Hours, 15 Minutes

【问题讨论】:

    标签: ssis


    【解决方案1】:

    鉴于您的文本格式为

    string;#0 Day(s), 08  Hours,  15  Minutes
    

    希望删除从# 到字符串开头的所有内容,包括端点,我会考虑使用 RIGHT 运算符。我想要最右边的字符从 # 的位置开始到最后。

    我发现将这类事情分解为多个步骤很有帮助,尤其是对于调试而言。

    DER 计算#位置

    我创建了一个派生列来计算# 的位置。这是一个基于一的序数系统,所以我应该根据上述得到值 8。我在派生列组件中添加了一个名为SharpPosition Int32 数据类型的新列

    FINDSTRING([Modified By],"#",1)
    

    给定一个样本,我们不知道是否需要考虑源数据中的 NULL 或 # 是否始终存在。采用这样的方法通常很有帮助,因为它可以让您识别出中断的表达式的特定部分。

    DER 结果字符串长度

    在这里,我计算得到的字符串长度,以便最终操作更容易。再次,简单的安全检查以确保我有正确的值。新列,ResultingLength,表达式为

    LEN([Modified By]) - [SharpPosition]
    

    DER 权限修改者

    最后,我们有了确定原始字符串中需要修改的位置所需的拼图。

    我创建了一个名为 ModInfo 的字符串列,长度为 50,并使用了以下表达式

    RIGHT([Modified By], [ResultingLength])
    

    您可以将所有这些汇总到一个表达式中,但正如我一直提到的,我发现这种方法的维护更容易。

    比米尔

    没有一些代码来重现结果的答案是什么,嗯?如果您还没有安装免费扩展程序BIDS Helper,请安装它。

    现在您已经安装了 BIDS Helper,右键单击您的项目并选择添加新的 Biml 文件。

    在生成的 BimlScript.biml 文件中,粘贴以下内容。

    调整第 3 行以指向 SQL Server 实例。根据您的版本,您可能还需要从 SQLNCLI11.1 更新提供程序以匹配您的实例。

    完成后,右键单击 biml 文件并选择生成 SSIS 包。弹出一个闪亮的新 SSIS 包,其中包含所有正确的组件和表达式。

    <Biml xmlns="http://schemas.varigence.com/biml.xsd">
        <Connections>
            <Connection Name="tempdb" ConnectionString="Data Source=localhost\dev2012;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;" />
        </Connections>
        <Packages>
            <Package Name="so_33020866">
                <Tasks>
                    <Dataflow Name="DFT Demo">
                        <Transformations>
                            <OleDbSource ConnectionName="tempdb" Name="OLE_SRC Demo">
                                <DirectInput>SELECT 'string;#0 Day(s), 08  Hours,  15  Minutes' AS [Modified By] UNION ALL SELECT NULL UNION ALL SELECT ''</DirectInput>
                            </OleDbSource>
                            <DerivedColumns Name="DER Calculate # position">
                                <Columns>
                                    <Column DataType="Int32" Name="SharpPosition">FINDSTRING([Modified By],"#",1)</Column>
                                </Columns>
                            </DerivedColumns>
                            <DerivedColumns Name="DER Resulting String Length">
                                <Columns>
                                    <Column DataType="Int32" Name="ResultingLength">LEN([Modified By]) - [SharpPosition]</Column>
                                </Columns>
                            </DerivedColumns>
                            <DerivedColumns Name="DER Right Modified By">
                                <Columns>
                                    <Column DataType="String" Name="ModInfo" Length="50">RIGHT([Modified By], [ResultingLength])</Column>
                                </Columns>
                            </DerivedColumns>
                            <DerivedColumns Name="DER PlaceHolder"></DerivedColumns>
                        </Transformations>
                    </Dataflow>
                </Tasks>
            </Package>
        </Packages>
    </Biml>
    

    结果

    你可以看到我用你的源字符串模拟了一个没有#和NULL的字符串。他们都没有失败。

    【讨论】:

      【解决方案2】:

      我想,这就是你想要的:

      SUBSTRING([Modified By],FINDSTRING([Modified By],"#",1) + 1,LEN([Modified By]) - (FINDSTRING([Modified By],"#",1) + 1) )
      

      【讨论】:

        【解决方案3】:

        我认为这个表达式可以正常工作。

        将此表达式写入派生列表达式中。

        SUBSTRING([修改者],FINDSTRING([修改者],"#",1) + 1,len([修改者]))

        【讨论】:

        • 没错,工作得很好,谢谢,我只需要放这个len([Modified By])而不是这个FINDSTRING([Modified By],"#", 1)
        猜你喜欢
        • 2020-10-07
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多