我在Ms access 2k daabase中有一个大表,我需要一种方法来复制这个表,然后在sql server上填充我已经准备好的两个表。
我可以使用迁移工具但是我们可以通过Ms访问来执行它,就像执行存储过程或ODBC连接的表单一样。
我在想的是在ms访问中创建一个表单,该表单应该有一个浏览按钮,用于选择我的源访问mdb文件,然后另一个用于处理的按钮[在通过浏览按钮点击上面指定的表时应该导入到sql server中]? 这可能吗? 请给我一些细节
先谢谢
答案 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版本),这可以通过减少工作来更有效地完成工作。