我想出了一個方法來做到這一點。如果有人陷入同樣的情況,我想我會分享。
因此,總之,我需要通過文件導出和導入數據。出於各種原因,我也想盡可能使用格式文件。
我所做的是
1)構造一個DFT這讓我的表名的列表,從我需要導出數據庫。我使用'oledb'作爲源和'記錄集目標'作爲目標,並將表名存儲在對象變量中。
DFT並不是真的有必要。你可以用其他方式做。另外,在我們的應用程序中,我們將表名存儲在一個表中。
2)添加一個「對於每個循環容器」與「對於每個ADO枚舉」這需要我的對象變量來自前面步驟進入收集。
3)由一個解析變量之一,並構造像下面BCP語句腳本任務內部。根據需要創建變量。 BCP語句將存儲在一個變量中。
通過各表環和構建多個BCP語句這樣。
BCP 「DBNAME.DBO.TABLENAME1」 走出去 「路徑\ FILENAME2.dat」 -s服務器-T -t 「| 」 -r $ \ n -f 「PATH \ filename.fmt」
BCP 「DBNAME.DBO.TABLENAME1」 走出去 「路徑\ FILENAME2.dat」 -s服務器-T -t 「| 」 -r $ \ n -f 「PATH \ filename.fmt」
這些語句放在一個.bat文件中。這也是在腳本任務內完成的。
4)執行進程任務接下來將執行.BAT文件。我必須這樣做,因爲我沒有選擇在我的公司中使用'master..xp_cmdShell'命令或'BULK INSERT'命令。如果我可以選擇執行cmdshell,我可以直接從包中運行命令。
5)再次爲每個循環容器添加一個'For Each ADO Enumerator',它將上一步中的對象變量放入集合中。
6)逐個解析變量並在腳本任務中構建像這樣的BCP語句。根據需要創建變量。 BCP語句將存儲在一個變量中。
我循環遍歷表並構建多個BCP語句,如下所示。
BCP 「DBNAME.DBO.TABLENAME1」 中的 「PATH \ FILENAME2.dat」 -s服務器-T -t 「| 」 -r $ \ n -b10000 -f 「PATH \ filename.fmt」
BCP 「DBNAME.DBO.TABLENAME1」 中的 「PATH \ FILENAME2.dat」 -s服務器-T -t 「| 」 -r $ \ n -b10000 -f 「PATH \ filename.fmt」
這些語句放在一個.bat文件中。這也是在腳本任務內完成的。
-b10000被放置,所以我可以批量導入。如果沒有這麼多的大表,由於tempdb中的空間不足而無法複製。
7)運行.bat文件再次導入文件。
我不確定這是否是最佳解決方案。我仍然認爲我會分享滿足我的要求的東西。如果我的回答不明確,我會很樂意解釋你是否有任何問題。我們也可以優化這個解決方案。完全可以通過VB腳本來完成,但您必須編寫一些代碼才能完成此操作。
我還創建了一個包配置文件,我可以在其中動態更改數據庫名稱,服務器名稱,數據和格式文件位置。
謝謝。
我認爲有一個原因,你不只是推動數據從A到B,並跳過整個文件業務? – billinkc 2014-10-10 15:18:04
是的。目標可能是生產有時和我們的DBA和安全不允許由於各種原因。有時我們可能需要保留特定日期的數據,然後在目標數日後重新申請。這兩個是原因。 – 2014-10-10 15:22:07
夠公平的。簡而言之,你無法做你想做的事。數據流緊密綁定到源元數據,並且在運行時無法更改。如果您可以安裝[BIDS Helper](http://bidshelper.codeplex。com),我可以告訴你如何使用一些Biml來自動生成軟件包代碼 – billinkc 2014-10-10 15:29:10