复制Ms访问单个Big Table到Sql server两个小表

时间:2009-08-29 02:11:23

标签: sql-server sql-server-2005 ms-access vba

我在Ms access 2k daabase中有一个大表,我需要一种方法来复制这个表,然后在sql server上填充我已经准备好的两个表。

我可以使用迁移工具但是我们可以通过Ms访问来执行它,就像执行存储过程或ODBC连接的表单一样。

我在想的是在ms访问中创建一个表单,该表单应该有一个浏览按钮,用于选择我的源访问mdb文件,然后另一个用于处理的按钮[在通过浏览按钮点击上面指定的表时应该导入到sql server中]? 这可能吗? 请给我一些细节

先谢谢

5 个答案:

答案 0 :(得分:1)

您可以在MS Access中设置指向两个SQL Server表的表链接。

然后,您可以创建一个从源表填充每个表的查询。

答案 1 :(得分:0)

  

我在Ms access 2k数据库中有一个大表,我需要一种方法来复制这个表,然后在SQL服务器上填充我已经准备好的两个表。

“大”有多大? SQL Server应该能够处理您在Access中存储的任何单个表。我不认为数TB的数据是不可行的。

您可以使用Microsoft SSIS。或者只是转储Access数据库的.csv表示并将其导入SQL Server。或者upsize访问SQL Server。

你的问题让我感到困惑。除了这一个大表之外,还有两个“已经准备好”的表,还有其他数据存储在其中吗?我当然希望它们没有与Access中的“大”表相同的布局(违反第一范式),并鼓励你将数据从它们之间的Access中分开,认为它是某种改进。

答案 2 :(得分:0)

您可以创建一个Access项目(.adp)到Sql Server,然后使用MS Access中的文件>导入菜单(在.adp中)将您的表导入(.adp),从而导入Sql Server。

然后只使用一个简单的SELECT INTO存储过程从导入的表中填充Sql Server中的表。

答案 3 :(得分:0)

以下是一些代码,您可以使用这些代码从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

答案 4 :(得分:0)

我怀疑使用ODBC链接表从Access运行INSERT会非常慢,因为Jet / ACE倾向于将每一行分解为单独的INSERT语句。 Jet / ACE是多用户服务器数据库的良好公民用户,因为这允许服务器序列化由多个用户生成的操作,并将其他更新与大量更新交错。但是对于大型数据集而言,它的速度非常慢,当你正在做类似于初始化空数据集的事情时,它正在过于“对公民负责。”

您可以考虑重命名现有表,而是通过ODBC DSN将Access表导出到SQL Server。如果您已经定义了DSN,只需从Access中的FILE菜单中选择EXPORT,选择DSN作为目标,Jet / ACE负责其余部分,在服务器上创建表并上传所有数据。它是非常有效的(即,一次不会做一个记录),因为Jet / ACE知道它填充了以前不存在的表。

现在,结果可能不是您想要的(Jet / ACE可能无法正确获取所有数据类型,因为ODBC驱动程序的转换方面,但数据类型应该是兼容的,如果确切的最严格的数据类型但是,您将在SQL Server数据库中拥有完整的数据集,然后可以从一个SQL Server表附加到正确结构化的数据集。

您可能需要检查数据以确保没有数据丢失或错误转换(例如,这将是一个文本邮政编码字段转换为数字 - 这实际上永远不会发生,但是这是你想要检查的那种东西),但是当你没有很好的升迁工具时,我会想到一个500MB的数据集(因为Access版本无法跟上最近的SQL Server版本),这可以通过减少工作来更有效地完成工作。