复制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两张小表的主要内容,如果未能解决你的问题,请参考以下文章