我正在尝试从入站数据中删除一些不需要的文本值。收到的数据如下:
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
答案 0 :(得分:8)
鉴于你有
形式的文字string;#0 Day(s), 08 Hours, 15 Minutes
希望删除从#
到字符串开头的所有内容,包括端点,我会看看使用RIGHT运算符。我希望最右边的字符从#的位置开始,然后结束。
我发现它有用,特别是对于调试来说,将这些事情分解成许多步骤。
我创建了一个派生列来计算#的位置。这是一个基于序的系统,所以我应该根据上面的值得到值8。我在Derived Column Component中添加了一个名为SharpPosition
数据类型Int32
FINDSTRING([Modified By],"#",1)
给出一个样本,我们不知道是否需要考虑源数据中的NULL或#是否总是存在。采用这样的方法通常是有帮助的,因为它允许您识别断开的表达式的特定部分。
在这里,我计算得到的字符串长度,以便最后的操作更容易。再次,简单的安全检查,以确保我有正确的值。新列ResultingLength
和表达式
LEN([Modified By]) - [SharpPosition]
最后,我们需要确定我们需要修改的原始字符串中的位置。
我创建一个名为ModInfo的字符串列,长度为50并使用以下表达式
RIGHT([Modified By], [ResultingLength])
你可以将所有内容整合到一个表达式中,但正如我一直提到的,我觉得这种方法的维护更容易。
没有一些代码可以重现结果,是什么答案,是吗?如果您还没有安装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>
你可以看到我用你的源字符串模拟,一个没有#和NULL的字符串。他们都没有失败。
答案 1 :(得分:1)
我想,这就是你想要的:
SUBSTRING([Modified By],FINDSTRING([Modified By],"#",1) + 1,LEN([Modified By]) - (FINDSTRING([Modified By],"#",1) + 1) )
答案 2 :(得分:-2)
我认为这个表达式能够正常运作。
将此表达式写入派生列表达式。
SUBSTRING([Modified By],FINDSTRING([Modified By],“#”,1)+ 1,len([Modified By]))