表1具有場「A」查找和替換的字段,並留下一個「不可用」的缺省輸出爲不匹配的記錄
表2具有字段「B」和「C」
表3將接收字段'A'和'D'的插入,'D'從'C'生成,其中'A'匹配'B'或者顯示'不可用'字符串用於每個記錄,其中'A'沒有匹配' B'字段。
我實際上正在嘗試在SSIS中複製抄寫員DBLookupDefault行爲,但在單個數據流中複製此行爲非常棘手。
表1具有場「A」查找和替換的字段,並留下一個「不可用」的缺省輸出爲不匹配的記錄
表2具有字段「B」和「C」
表3將接收字段'A'和'D'的插入,'D'從'C'生成,其中'A'匹配'B'或者顯示'不可用'字符串用於每個記錄,其中'A'沒有匹配' B'字段。
我實際上正在嘗試在SSIS中複製抄寫員DBLookupDefault行爲,但在單個數據流中複製此行爲非常棘手。
我會將此作爲一個查找與不匹配選項設置爲忽略失敗。如果我們做一個匹配,我們將在C柱,別名爲D.添加,否則,我們將有NULL
查找後,我們希望有一個派生列,檢查我們的新崛起的價值D欄。如果它是NULL,那麼我們將修補我們未知的文本。我很懶惰,並使用SSIS變量來做到這一點。你想表達的是
ISNULL([D]) ? @[User::Lookup_Unknown] : [D]
源查詢
SELECT * FROM (VALUES (10), (20), (30), (40))T1(A);
查找查詢
我故意排除30值。我也不得不填充我的字符串,以確保我有空間放入不匹配的文本。我設置了派生列替換「d」
SELECT B, CAST(C AS varchar(50)) AS C FROM (VALUES (10, 'Foo'), (20, 'Bar'), (40, 'Blee'))T2(B,C);
BIML,商業智能標記語言,描述了商業智能平臺。在這裏,我們將用它來描述ETL。 BIDS Helper,是Visual Studio/BIDS/SSDT的一個免費附加組件,可解決許多缺點。在這裏,我使用它來創建一個包,您可以在自己的環境中創建一個包,以便與您所做的相比較。您需要更新第三行以將連接管理器指向有效實例
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;" />
</Connections>
<Packages>
<Package ConstraintMode="Linear" Name="so_29398714">
<Variables>
<Variable DataType="String" Name="Lookup_Unknown">Not Available</Variable>
</Variables>
<Tasks>
<Dataflow Name="DFT Lookup Ignore Failure">
<Transformations>
<!--
Simulate source table
-->
<OleDbSource ConnectionName="CM_OLE" Name="OLE_SRC">
<DirectInput>SELECT * FROM (VALUES (10), (20), (30), (40))T1(A);</DirectInput>
</OleDbSource>
<!--
Lookup Important thing is to ignore failure
Here we exlude 30 from our sample data
Match based on T1.A to T2.B
-->
<Lookup Name="LKP Data" NoMatchBehavior="IgnoreFailure" OleDbConnectionName="CM_OLE">
<DirectInput>SELECT B, CAST(C AS varchar(50)) AS C FROM (VALUES (10, 'Foo'), (20, 'Bar'), (40, 'Blee'))T2(B,C);</DirectInput>
<Inputs>
<Column SourceColumn="A" TargetColumn="B" />
</Inputs>
<Outputs>
<Column SourceColumn="C" TargetColumn="D" />
</Outputs>
</Lookup>
<!--
Add derived column to handle the nulls for missed lookups
-->
<DerivedColumns Name="DER Handle missed lookups">
<Columns>
<Column DataType="AnsiString" Name="D" ReplaceExisting="true">ISNULL([D]) ? @[User::Lookup_Unknown] : [D]</Column>
</Columns>
</DerivedColumns>
<!--
Add a placeholder for my data viewer
-->
<DerivedColumns Name="DER Data Viewer Placeholder"></DerivedColumns>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
重新聲明:源數據是T1.A和T1.D.查找基於T1.A = T2.B.如果找到,則用T2.C替換T1.D管道值。如果沒有發現任何內容,用'Not Available'代替文本。 – billinkc 2015-04-01 19:02:50
如果我具有上述的正確性,是否有將T1.D拉出源系統的價值?查找後,它不是N/A或T2.C – billinkc 2015-04-01 19:03:29
@billinkc T1.D實際上基本上會成爲一個新領域。我忘了提這個。在對T2進行檢查之前,T1將不會有字段'D'。 – 2015-04-01 19:05:47