2016-08-31 32 views
2

我有幾個程序(sql server)產生輸出,我手動將它們保存在帶有標題的文本文件中。通用ssis包使用多個過程來創建輸出文本文件

我需要一個通用的SSIS包,它將procedure_name,output_filename作爲輸入並生成輸出文本文件。

由於不同的過程產生不同的列,我需要動態地處理元數據。

例:PROC1產生以下結果

COL1 | COL2

A | B

PROC2產生以下結果:

COL1 | COL2 | COL3

1 | 2 | a

一個解決方案是改變所有程序res作爲單行生成輸出,因此SSIS將其視爲一列並生成輸出文件。 例如:

'COL1 | COL2 |科爾' AS rowdata

'1 | 2 |一個' AS rowdata

但是,也有相當多的程序和不斷變化的每一個程序需要大量的時間並可能最終導致人爲錯誤。

所以,我想知道,如果在SSIS中有一種方法,我可以動態處理元數據並生成輸出文件。

回答

1

您可以查看BiML,它使用元數據動態構建並執行包。

+0

感謝您打開BIML爲我開門。我完全沒有意識到這一點。因爲這將需要一段時間我去嘗試一些腳本和理解BIML是如何工作的,有沒有什麼直接的聯繫/腳本,回答我的問題?稍微類似的腳本也可以。 – Ash

+0

沒有呢,可惜我沒有直接解決您的問題的捷徑。只要BiML可以導致解決方案。 –

0

那麼,傳統的SSIS包幾乎不可能,所有的輸出都是在設計時定義的,並且在運行時驗證。更改其編號會導致驗證錯誤並停止包執行。
您可以使用SQL執行任務和腳本組件來玩弄技巧。 Exec SQL運行SP並將SP結果作爲存儲在Object變量中的「完整結果集」返回。然後在腳本任務中打開這個實際上是ADO記錄集的變量;它可以被System.Data.OleDb.OleDbDataAdapter讀取。例如:

// Set up the DataAdapter to extract the data, 
// and the DataTable object to capture those results 
OleDbDataAdapter da = OleDbDataAdapter(); 
DataTable dt = DataTable(); 
// Extract the data from the object variable into the table 
da.Fill(dt, Variables.vResults); 

然後,您可以使用DataSet並將其展平爲單個變量以備後用。或者 - 直接在C#腳本中創建並保存文件。

+0

我是C#的新手。有超過1000萬條記錄,並不確定腳本如何處理這種數據量。另外,感覺可怕的是將所有這些數據放在一個變量中。 – Ash

+1

@Ash,10M記錄在一個對象變量和更高版本 - 在C#腳本解析都很好。 問題在於你的目標和SSIS作爲一種工具。如果您想要一個運行SP的通用SP處理器並將其結果存儲在一個幾乎不需要轉換的文件中,那麼純C#會更簡單。您可以嘗試SQL中的SQLCMD或BCP實用程序。 如果您需要轉換某些固定佈局數據,SSIS會發光;它允許在可視化工具中設計大部分數據轉換。你的任務更加簡單和通用 - SSIS優勢成爲一種負擔。 – Ferdipux

+0

謝謝你的答覆Ferdipux。 – Ash

相關問題