【问题标题】:copy Ms access single Big Table to Sql server two small tables复制ms访问单个大表到sql server两张小表
【发布时间】: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 表中,一些字段到一个,其余到另一个

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


【解决方案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 版本),这可能会以更少的工作更有效地完成工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2014-10-22
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多