2013-01-21 66 views
3

我有一個包含300多個Access數據庫(由我無法控制的程序編寫)的文件夾。他們都有相同的結構,只有一張桌子。我正在將數據導入到SQL Server(2005)中的表中。使用導入嚮導很好,但一次只能使用一個Access數據庫。如何使用SSIS將多個Access數據庫導入到SQL Server中

我已經搜查,搜查的方式做到這一點,我想我是在用一個數據流任務foreach循環容器裏面的東西。但是,我只能看到用Excel文件或平面文件作爲源代碼的方法。

任何幫助,非常感謝。

+0

這是一次性任務。不,我不承諾SSIS。我只是認爲這可能是一條路,但我對任何事情都是開放的。 –

+3

您使用ForEach循環容器的方法將使用正確的SSIS方法。無論是配置平面文件,Excel還是Access都無所謂,邏輯是一樣的。 ForEach枚舉器將彈出一個值,然後您將使用該值作爲Access Connection Manager的ConnectionString屬性上的表達式的一部分。讓我知道你是否需要這個完整的答案。 – billinkc

回答

1

對於一次性的任務,你可以使用被扔掉的VBA代碼。

創建一個新的數據庫,並且數據庫中創建一個ODBC鏈接到你的SQL Server表。

然後創建一個類似的新的Access查詢:

INSERT INTO remote_table (<field list>) 
SELECT <field list> 
FROM YourTable In 'C:\SourceFolder\db1.mdb'; 

如果字段命名爲源和目的地相同,則可以省略<field list>

INSERT INTO remote_table 
SELECT * 
FROM YourTable In 'C:\SourceFolder\db1.mdb'; 

在最佳情況下,Access字段值將與SQL Server字段類型兼容。如果不是,則必須使用Access函數將字段值轉換爲SQL Server兼容類型。

一旦你有一個排序,一個VBA程序,從您的Access數據庫文件上傳數據可以快速&簡單:

Sub Test() 
Const cstrExtension As String = "mdb" 
Const cstrFolder As String = "C:\SourceFolder\" 
Dim db As DAO.database 
Dim strDbFile As String 
Dim strInsert As String 

strInsert = "INSERT INTO remote_table (<field list>)" & vbCrLf & _ 
    "SELECT <field list>" & vbCrLf & _ 
    "FROM YourTable In 'DB_FILE';" 
Set db = CurrentDb 
strDbFile = Dir(cstrFolder & "*." & cstrExtension) 
Do While Len(strDbFile) > 0 
    db.Execute Replace(strInsert, DB_FILE, _ 
     cstrFolder & strDbFile), dbFailOnError 
    strDbFile = Dir() 
Loop 
Set db = Nothing 
End Sub 
+0

我現在不在,但今天晚些時候會試一試,謝謝。我在SQL Server中創建了表,以便字段名稱和值相同。我已經用導入嚮導導入了幾個Access數據庫,所以我知道一切都準備好了。多年來我沒有使用過Access,這也可以通過SQL Server上的存儲過程來完成嗎? –

+0

對不起,我沒有注意到存儲過程中的問題。您可以使用Access數據庫文件作爲「鏈接服務器」來執行此類操作。但300 Access數據庫文件使這看起來令人生畏。如果您對我建議的方法不感興趣,我認爲您應該跟進他提供SSIS解決方案的@billinkc RE。 – HansUp

1

你需要做的是這樣的:

1.-創建包含2個變量,一個名爲「current_file」,另一個名爲「loading_location」(或者您喜歡的名稱),包含範圍在數據包上,數據類型爲String,對current_file保持爲空,在load_location上放置路由文件夾與Access數據庫。

2:添加Foreach循環容器,裏面是去收集,選擇表達式,並添加一個新的表達。在屬性中選擇目錄,在表達式中選擇剛剛創建的loading_location變量。 回到收集一次在文件中把這個:* .MDB

保留所有其他選項都是相同的。然後進入變量映射,並在變量中選擇current_file變量。

3.-創建一個新的OLE DB連接。在提供程序選擇「Microsoft Jet 4.0 OLE DB提供程序」上,在數據庫文件名上選擇任何訪問數據庫(稍後將更改這些數據庫不用擔心)。

4.-創建Foreach循環容器內的數據流任務中,添加一個OLE DB源的數據流任務內。在連接管理器中打開OLE DB Source,選擇剛剛創建的連接,在數據訪問模式中選擇「表或視圖」併爲數據庫選擇表格。

5.-添加一個OLE DB目標,爲目標數據庫選擇相應的連接,並選擇你要爲Access數據庫放置數據的表。

現在,我們將做出改變這個要經過每一個Access數據庫..

6.-選擇您的Access數據庫中創建的連接,進入屬性窗口,並注意在ConnectionString的值,在我的情況下,它是:

Data Source =「MyAccessDBFile」; Provider = Microsoft.Jet.OLEDB.4.0;

根據對數據庫的許可,您可能會有額外的東西。 現在轉到Expression屬性,展開它,我們將添加2個表達式。一個通過屬性「ConnectionString」,並在表達式中放入

「Data Source =」+ yourCurrentFileVariable +「; Provider = Microsoft.Jet.OLEDB.4.0;」

你應該得到的東西是這樣的:

「數據源=」 + @ [用戶:: current_file] + 「;供應商= Microsoft.Jet.OLEDB.4.0;」

添加一個新的表達式屬性「服務器名稱」,在這一個選擇current_file變量表達式,你應該得到的表達領域是這樣的:

@ [用戶:: current_file]

image

7.-現在你將在OLE DB Source中得到一個錯誤,不用擔心它只是因爲current_file變量沒有任何值。回到Foreach循環容器中的數據流任務,並將DelayValidation屬性設置爲true。轉到項目 - >「你的包」屬性 - >調試,並將Run64BitRunteime設置爲false。

image

就是這樣。

相關問題