从SSIS派生列中的字符串中删除文本

osm*_*sm2 0 ssis

我试图从入站数据中删除一些不需要的文本值.收到的数据如下:

string;#0 Day(s), 08  Hours,  15  Minutes
Run Code Online (Sandbox Code Playgroud)

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

SUBSTRING([Modified By], FINDSTRING([Modified By],"#",1) + 1, FINDSTRING([Modified By],"#", 1))
Run Code Online (Sandbox Code Playgroud)

之后才能得到什么 #

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

bil*_*nkc 8

鉴于你有文本的形式

string;#0 Day(s), 08  Hours,  15  Minutes
Run Code Online (Sandbox Code Playgroud)

希望从#字符串的开头删除所有内容,包括端点,我会看看使用RIGHT运算符.我希望最右边的字符从#的位置开始,然后结束.

在此输入图像描述

我发现将这些事情分解成许多步骤对于调试很有帮助.

DER计算#位置

我创建了一个派生列来计算#的位置.这是一个基于序的系统,所以我应该根据上面的值得到值8.我在Derived Column Component中添加了一个名为SharpPositionInt32数据类型的新列

FINDSTRING([Modified By],"#",1)
Run Code Online (Sandbox Code Playgroud)

给定一个样本,我们不知道是否需要考虑源数据中的NULL或#是否总是存在.采用这样的方法通常是有帮助的,因为它允许您识别断开的表达式的特定部分.

DER结果字符串长度

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

LEN([Modified By]) - [SharpPosition]
Run Code Online (Sandbox Code Playgroud)

DER Right Modified By

最后,我们需要确定我们需要修改的原始字符串中的位置.

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

RIGHT([Modified By], [ResultingLength])
Run Code Online (Sandbox Code Playgroud)

您可以将所有内容整合到一个表达式中,但正如我一直提到的,这种方法的维护我觉得更容易.

BIML

没有一些代码可以重现结果,是什么答案,是吗?如果您还没有安装BIDS Helper的免费扩展,请安装它.

现在您已安装BIDS Helper,右键单击您的项目并选择Add new Biml file.

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

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

完成后,右键单击biml文件并选择Generate SSIS Package.Out弹出一个闪亮的新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>
Run Code Online (Sandbox Code Playgroud)

结果

您可以看到我使用您的源字符串进行模拟,该字符串没有#和NULL.他们都没有失败.

在此输入图像描述