2014-10-10 132 views
0

我必須在兩個SQL Server DB之間移動數據。我的任務是將數據導出爲文本(.dat)文件,移動文件並導入到目標中。我必須遷移超過200個表格。SSIS - 將多個SQL Server表導出到多個文本文件

這是我試過

1)我使用了一個執行SQL任務來獲取我的表。 2)使用a用於每個循環循環遍歷集合中的表名稱。 3)在每個循環內部使用腳本任務來構建文本文件目標路徑。 4)調用一個DFT,其中源變量的表名稱爲源ole數據庫,目標平面文件的變量中的路徑名稱。

第一個表提取罰款,但第二個表炸彈與同步錯誤。我看到這是很多帖子,但找不到與我的場景相匹配的帖子。因此張貼在這裏。

即使我得到的包帶多的DFT工作,從第二DFT第二個表不導出列,因爲平面文件連接管理器還記得第一個表列。有沒有辦法讓它忘記列?

有關如何使用動態源和目標變量使用一個DFT將多個表導出到多個文本文件的任何想法?

感謝並感謝您的幫助。

+0

我認爲有一個原因,你不只是推動數據從A到B,並跳過整個文件業務? – billinkc 2014-10-10 15:18:04

+0

是的。目標可能是生產有時和我們的DBA和安全不允許由於各種原因。有時我們可能需要保留特定日期的數據,然後在目標數日後重新申請。這兩個是原因。 – 2014-10-10 15:22:07

+0

夠公平的。簡而言之,你無法做你想做的事。數據流緊密綁定到源元數據,並且在運行時無法更改。如果您可以安裝[BIDS Helper](http://bidshelper.codeplex。com),我可以告訴你如何使用一些Biml來自動生成軟件包代碼 – billinkc 2014-10-10 15:29:10

回答

0

我想出了一個方法來做到這一點。如果有人陷入同樣的​​情況,我想我會分享。

因此,總之,我需要通過文件導出和導入數據。出於各種原因,我也想盡可能使用格式文件。

我所做的是

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腳本來完成,但您必須編寫一些代碼才能完成此操作。

我還創建了一個包配置文件,我可以在其中動態更改數據庫名稱,服務器名稱,數據和格式文件位置。

謝謝。

1

不幸的是,批量導入任務僅使我們能夠有效地使用格式文件來映射源和目標之間的列。批量導入任務使用BULK INSERT TSQL命令導入數據,執行用戶應具有BULKADMIN服務器特權。

由於安全原因,大多數公司不允許BULKADMIN服務器權限啓用。 因此使用腳本任務來構建BCP語句是Export的一個很好且簡單的選項。 您不需要構建.bat文件,因爲腳本本身可以執行在.NET安全帳戶下運行的dos命令。

+0

謝謝。是的,我有與特權相同的問題。但是,這種解決方案符合我的需求。 – 2014-12-24 17:33:41