簡體   English   中英

將女士訪問單個大表復制到Sql Server兩個小表

[英]copy Ms access single Big Table to Sql server two small tables

我在Ms access 2k daabase中有一個大表,我需要一種方法來復制此表,然后在sql server上填充我的兩個已經准備好的表。

我可以使用遷移工具,但是有什么方法可以通過Ms訪問來完成,例如執行存儲過程或ODBC連接的表單。

我在想什么是在ms access中創建一個表單,該表單應具有用於選擇我的源訪問mdb文件的瀏覽按鈕,然后另一個按鈕進行處理[在單擊上面通過瀏覽按鈕指定的表時,應將其導入sql server]? 這有可能嗎? 請給我一些細節

提前致謝

您可以從MS Access內部設置到兩個SQL Server表的表鏈接。

然后,您可以創建一個查詢,以填充源表中的每個表。

我在Ms Access 2k數據庫中只有一個大表,我需要一種方法來復制此表,然后在SQL Server上填充我的兩個已經准備好的表。

“大”有多大? SQL Server應該能夠處理您將存儲在Access中的任何單個表。 我並不認為一兆字節的數據是不可行的。

您可以使用Microsoft SSIS 或者只是轉儲Access數據庫的.csv表示形式並將其導入到SQL Server中。 升遷訪問SQL Server。

您的問題使我感到困惑。 除了這個大表以外,是否還有兩個“已經准備好”的表以及其他要存儲的數據? 我當然希望它們與Access中的“大”表沒有相同的布局(違反第一個常規形式),並鼓勵您在他們之間划分Access中的數據,以為這是某種改進。

您可以為Sql Server創建一個Access Project(.adp),然后使用MS Access(在.adp中)的File> Import菜單將表導入到(.adp)中,從而導入到Sql Server中。

然后,只需使用簡單的SELECT INTO存儲過程,即可從導入的表中填充Sql Server中的表。

以下是一些代碼,可用於從Access生成到SQL Server數據庫中的表的DSNless鏈接。 它至少在Access 2003中有效。運行此代碼后,可以像其他任何Access表一樣直接操作SQL表。

'Name     :   AttachDSNLessTable
'Purpose  :   Create a linked table to SQL Server without using a DSN
'Parameters
'     stLocalTableName: Name of the table that you are creating in the current     database
'     stRemoteTableName: Name of the table that you are linking to on the SQL Server database
'     stServer: Name of the SQL Server that you are linking to
'     stDatabase: Name of the SQL Server database that you are linking to
'     stUsername: Name of the SQL Server user who can connect to SQL Server, leave blank to use a Trusted Connection
'     stPassword: SQL Server user password
Function AttachDSNLessTable(stLocalTableName As String, stRemoteTableName As String, stServer As String, _
                        stDatabase As String, _
                        Optional stUsername As String, Optional stPassword As String)

    On Error GoTo AttachDSNLessTable_Err
    Dim td As TableDef

    For Each td In CurrentDb.TableDefs
        If td.Name = stLocalTableName Then
            CurrentDb.TableDefs.Delete stLocalTableName
        End If
    Next

    If Len(stUsername) = 0 Then
        'Use trusted authentication if stUsername is not supplied.
        stConnect = "ODBC;DRIVER=SQL Server;SERVER=" & stServer & ";DATABASE=" & stDatabase & ";Trusted_Connection=Yes"
    Else
        'WARNING: This will save the username and the password with the linked table information.
        stConnect = "ODBC;DRIVER=SQL Server;SERVER=" & stServer & ";DATABASE=" & stDatabase & ";UID=" & stUsername & ";PWD=" & stPassword
    End If
    Set td = CurrentDb.CreateTableDef(stLocalTableName, dbAttachSavePWD, stRemoteTableName, stConnect)
    CurrentDb.TableDefs.Append td
    AttachDSNLessTable = True
    Exit Function

AttachDSNLessTable_Err:

     AttachDSNLessTable = False
    MsgBox "Error while trying to link to SQL Server on " & stServer & ": " & Err.Description

End Function

我懷疑從Access使用ODBC鏈接表運行INSERT會非常慢,因為Jet / ACE傾向於將每一行分解為單獨的INSERT語句。 Jet / ACE是多用戶服務器數據庫的良好公民用戶,因為它允許服務器序列化由多個用戶生成的操作,並將其他更新與大量更新交織在一起。 但是對於大型數據集來說,這太慢了,而且當您執行類似的操作時(初始化一個空數據集),它過於 “負責任”。

您可能會考慮重命名現有表,而是通過ODBC DSN將Access表導出到SQL Server。 如果已經定義了DSN,則只需從Access中的“文件”菜單中選擇“導出”,然后選擇DSN作為目標位置,然后Jet / ACE負責其余的工作,在服務器上創建表並上傳所有數據。 因為Jet / ACE知道它正在填充以前不存在的表,所以它非常高效(即一次不做一個記錄)。

現在,結果可能並不完全符合您的要求(由於ODBC驅動程序的轉換方面,Jet / ACE可能無法正確處理所有數據類型,但是如果需要最嚴格的數據類型,則數據類型應該兼容),但是您將在SQL Server數據庫中擁有完整的數據集,然后可以將其從一個SQL Server表追加到結構正確的表中。

您可能希望檢查數據以確保沒有數據丟失或轉換不正確(例如,將一個郵政編碼字段轉換為數字,這實際上是永遠不會發生的,但這種情況是一種要檢查的內容),但我認為對於500MB數據集,如果您沒有良好的升遷工具(因為Access版本無法跟上最新的SQL Server版本),這可能會工作量更少,工作效率更高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM