2015-04-01 50 views
1

表1具有場「A」查找和替換的字段,並留下一個「不可用」的缺省輸出爲不匹配的記錄

表2具有字段「B」和「C」

表3將接收字段'A'和'D'的插入,'D'從'C'生成,其中'A'匹配'B'或者顯示'不可用'字符串用於每個記錄,其中'A'沒有匹配' B'字段。

我實際上正在嘗試在SSIS中複製抄寫員DBLookupDefault行爲,但在單個數據流中複製此行爲非常棘手。

+0

重新聲明:源數據是T1.A和T1.D.查找基於T1.A = T2.B.如果找到,則用T2.C替換T1.D管道值。如果沒有發現任何內容,用'Not Available'代替文本。 – billinkc 2015-04-01 19:02:50

+0

如果我具有上述的正確性,是否有將T1.D拉出源系統的價值?查找後,它不是N/A或T2.C – billinkc 2015-04-01 19:03:29

+0

@billinkc T1.D實際上基本上會成爲一個新領域。我忘了提這個。在對T2進行檢查之前,T1將不會有字段'D'。 – 2015-04-01 19:05:47

回答

1

我會將此作爲一個查找與不匹配選項設置爲忽略失敗。如果我們做一個匹配,我們將在C柱,別名爲D.添加,否則,我們將有NULL

enter image description here

查找後,我們希望有一個派生列,檢查我們的新崛起的價值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

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> 
相關問題