复制ms访问单个大表到sql server两张小表

Posted

技术标签:

【中文标题】复制ms访问单个大表到sql server两张小表【英文标题】:copy Ms access single Big Table to Sql server two small tables 【发布时间】:2009-08-29 02:11:23 【问题描述】:

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

我可以使用迁移工具,但有什么方法可以从 Ms 访问中进行,例如执行存储过程或 ODBC 连接的表单。

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

提前致谢

【问题讨论】:

请描述MS Access和SQL Server中表的表结构。 访问表包含主键 [2 列] 和其他 8 个字段,我希望将这些数据导出到 sql server 表中,一些字段到一个,其余到另一个 【参考方案1】:

您可以从 MS Access 内部设置两个 SQL 服务器表的表链接。

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

big 是 5oomb 的数据,并且这两个表是单个表的规范化形式版本,它们是空的【参考方案3】:

您可以为 Sql Server 创建一个 Access Project (.adp),然后使用 MS Access 中的 File>Import 菜单(在 .adp 中)将您的表导入到 (.adp) 和 Sql Server 中。

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

【讨论】:

【参考方案4】:

以下代码可用于从 Access 生成指向 SQL Server 数据库中表的无 DSN 链接。它至少在 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

【讨论】:

我在网络驱动器上有访问表,但在此代码中您指定了“stLocalTableName:您在当前数据库中创建的表的名称”,因此如何将当前访问数据库设置为远程数据库开车?? 本地数据库中的每个表都有一个名称。 stLocalTableName 用于设置远程表的本地名称。通常 stLocalTableName 将与远程表的名称相同。但是,例如,如果您的本地数据库有一个表“名称”,而您链接到的远程数据库中的表也称为“名称”,该怎么办。然后你需要使 stLocalTableName 类似于“NamesRemote”。它不会改变远程表的名称。 哦,我现在搞错了..我想我想将访问表导出到 sql server 但上面的代码创建了一个链接表,结果是 ms 访问中的链接表,其中包含来自sql server 我想要与此完全相反的我想要带有访问表数据的 sql server 表,谢谢 但是现在您可以使用 Access 数据库中的 Access 查询将数据从您的 Access 表移动到链接的 SQL 表中。【参考方案5】:

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

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

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

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

【讨论】:

以上是关于复制ms访问单个大表到sql server两张小表的主要内容,如果未能解决你的问题,请参考以下文章

SQL性能问题.现在表设计可以把一个大表按类型(各类型字段不相同)拆分成多个小表.拆分后比较方便.

小表内连接大表,如何加快

SQL怎么从大表里面 查询包含小表的内容?

根据小表的结果修剪大表

SSIS MySQL 复制表到 SQL Server

SparkSQL的3种Join实现