gak*_*ife 2 sql-server sql-server-2014 ssis-2014
我有一个固定宽度的文本文件,我通过 SSIS 引入。作为 SQL Server 输入的一部分,我正在抓取一串字符并尝试将它们转换为派生列中的数字。
数据如下所示:
02 PR000000000000017943 0287801709
我需要获取 17943 并将其转换为 179.43
我尝试过的表达方式是:
(DT_NUMERIC,18,2)(SUBSTRING(EntireRow,10,18)
(DT_NUMERIC,18,2)TRIM(SUBSTRING(EntireRow,10,18))
Run Code Online (Sandbox Code Playgroud)
我不断收到以下错误:
组件“派生列”(2) 上的 ProcessInput 方法在处理输入“派生列输入”时失败,错误代码为 0xC0209029。
我已经看过了,但无法找到解决方案。
将字符串转换000000000000017943为十进制(18,2) 将导致值17943源没有小数位,那么为什么转换会知道您需要小数点呢?
此外,鉴于您的源数据,您的子字符串公式已关闭。这导致了一个源字符串R00000000000001794
也就是说,我采取了两种方法之一。我要么使用字符串操作插入小数位,要么使用数学除以 100。如果我已经在处理字符串,我通常会坚持使用这种方法,因为我讨厌不断地转换值。

去吃午饭,但这是我用来生成包的 Biml。抢bidshelper并用它来生成相同的SSIS包的我。
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<FileFormats>
<FlatFileFormat Name="FFF" IsUnicode="false" FlatFileType="Delimited">
<Columns>
<Column Name="EntireRow" DataType="AnsiString" Delimiter="CRLF" Length="58" />
</Columns>
</FlatFileFormat>
</FileFormats>
<Connections>
<FlatFileConnection FilePath="C:\ssisdata\dba_89464.txt" FileFormat="FFF" Name="CM_FF" />
</Connections>
<Packages>
<Package ConstraintMode="Linear" Name="dba_89464">
<Tasks>
<Dataflow Name="DFT Source">
<Transformations>
<FlatFileSource ConnectionName="CM_FF" Name="FF Source" />
<DerivedColumns Name="DER Split to row type">
<Columns>
<Column DataType="AnsiString" Name="Header" Length="2">SUBSTRING([EntireRow],1,2)</Column>
</Columns>
</DerivedColumns>
<ConditionalSplit Name="CSPL - Split on Header">
<OutputPaths>
<OutputPath Name="Type 2">
<Expression>[Header] == "02"</Expression>
</OutputPath>
</OutputPaths>
</ConditionalSplit>
<Multicast Name="MC Demo approaches">
<InputPath OutputPathName="CSPL - Split on Header.Type 2" />
<OutputPaths>
<OutputPath Name="String Approach" />
<OutputPath Name="Math Approach" />
</OutputPaths>
</Multicast>
<!--
Generate our value as string and one without the decimal place but of a numeric type
-->
<DerivedColumns Name="DER Type 2 processing">
<InputPath OutputPathName="MC Demo approaches.String Approach" />
<Columns>
<Column DataType="AnsiString" Name="strTemporaryMyValue" Length="18">TRIM(SUBSTRING(EntireRow,11,18))</Column>
</Columns>
</DerivedColumns>
<!--
Add our decimal place, string operations
This is not concerned with empty strings, etc
-->
<DerivedColumns Name="DER Add decimal place">
<Columns>
<Column DataType="AnsiString" Name="withDecimalPlace" Length="19">SUBSTRING([strTemporaryMyValue], 1, LEN([strTemporaryMyValue]) -2) + "." + RIGHT([strTemporaryMyValue], 2)</Column>
</Columns>
</DerivedColumns>
<DerivedColumns Name="DER Make string to decimal">
<Columns>
<Column DataType="Decimal" Name="MyValueViaString" Precision="18" Scale="2">(DT_NUMERIC, 18, 2)[withDecimalPlace]</Column>
</Columns>
</DerivedColumns>
<DerivedColumns Name="DER Dataviewer connector String" />
<DerivedColumns Name="DER slice string into numeric type">
<InputPath OutputPathName="MC Demo approaches.Math Approach" />
<Columns>
<Column DataType="Decimal" Name="decTemporaryMyValue" Precision="20" Scale="0">(DT_NUMERIC, 20, 0) TRIM(SUBSTRING(EntireRow,11,18))</Column>
</Columns>
</DerivedColumns>
<!--
Behold, the power of math
-->
<DerivedColumns Name="DER Divide approach">
<Columns>
<Column DataType="Decimal" Name="MyValue" Precision="18" Scale="2">(DT_NUMERIC, 18, 2)decTemporaryMyValue/100.0</Column>
</Columns>
</DerivedColumns>
<DerivedColumns Name="DER Dataviewer connector Math" />
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5351 次 |
| 最近记录: |