2015-06-16 65 views
0

我想通過使用OLEDB目標中的變量名選項選擇目標表來使用動態列映射。我收到錯誤:「OLE DB Destination」驗證失敗,並返回驗證狀態「VS_NEEDSNEWMETADATA」。SSIS動態列驗證

我從我讀過的內容中瞭解到,動態列驗證在SSIS中不可行。但是,那麼爲什麼可以使用變量名稱來選擇OLEDB中的表格目的地呢?不是動態列映射嗎?

我想要做的是創建一個foreach循環來讀取表的列表並將這些表從源數據庫導入暫存區域。在OLEDB中使用變量名稱目標似乎對我來說是完美的,但它不起作用,即使在數據流中啓用DelayValidation。

感謝, 羅德里戈

+2

對於具有相同元數據的不同表格。您不能動態更改元數據。 – mxix

回答

1

爲什麼我使用變量表名的我的OLE DB目標?

  1. 我自動化了我的SSIS包開發。我不需要指定每個表名,我有一個名爲FullyQualifiedName的變量,我填充一次然後重新用於我的包。考慮一個截斷和重新加載模式:執行SQL任務清除目標表,一個Foreach循環來加載所有文件 - 或者是因爲名稱是動態的,或者我有多天的數據加載,然後歸檔文件。在這種情況下,我需要至少引用該表格兩次。通過在變量中包含表名,我可以定義一次並在很多不同的位置引用它。

  2. 我曾經在我們根據客戶物理隔離數據的環境中工作。 Blackstone.Sales,Yampas.Sales,Ranger.Sales等。當顧客登錄時,他們的賬戶只能訪問他們的模式中的數據。這些表的結構相同,但名稱不同以確保隔離。對於這樣的場景,您可以將文件名與目標表匹配,因此希望使用變量來控制寫入的表。

正如你已經確定,你不能完成你正在嘗試的方式動態列映射。如果它是從源代碼到分段環境的直接副本,那麼我只需使用像Biml這樣的技術來生成軟件包並完成它。

0

我已經面對和處理過這樣的請求。否,SSIS不會允許您動態列映射。所以,我曾試圖對以下線的東西:

  1. 您需要首先使用您的系統的知識放在一起排序配置表中,將告訴你下面的東西 -

    - 源表(sourceTable會)

    -Columns從源表(SourceQuery)

    HINT提取:甲SELECT query..egSELECT ID, Name, Salary from dbo.tblEmployee

    -Destination表(destinationTable會)

    -Columns需要被從源

    -Few其他細節,如服務器名稱/連接的屬性等供給..

您需要稍後使用ForEach循環容器遍歷該表的各行。

  1. 接下來,在可能需要提取的源中確定這些列中的最大列數和最大數據類型長度。您需要儘快創建一個包含信息的表格。

  2. 創造一種臨時表的假設StgData。我將使用50列創建此表,所有數據類型爲NVARCHAR(MAX)。該CREATE語句應該是這樣的:

    CREATE TABLE StgData 
    (       
    Column1 NVARCHAR(MAX), 
    Column2 NVARCHAR(MAX), 
    Column3 NVARCHAR(MAX), 
    ....   
    Column50 NVARCHAR(MAX) 
    ) 
    

的原始數據將被加載到StgData

  1. 現在有一個ForEach循環容器遍歷ETLMappings。 在這裏面,您將不得不使用Execute SQL Task中的INSERT語句來加載數據。

裏面的任務腳本看起來像: -

INSERT INTO dbo.StgData 
? 

?對應SourceQuery柱(應當由ForEach容器被捕獲

一旦StgData被加載,它應該。被用於加載DestinationTable(也被捕獲在ForEach環形容器中)

現在你又需要對模式和列映射有很好的理解。配置表應該有一個存儲SQL查詢的列形式

INSERT INTO DestTable1 SELECT Col1, CAST(Col2 as float) Col2 FROM StgData 

這些行上的內容。

這只是一個基本的結構。當然很多格式和定製都必須添加。