我有一个古老的系统,它使用Access 97数据库来存储信息。我想每天将数据从90个表复制到SQL Server 2008数据库。我已经在SS2008中定义了表格。
有一个同样古老的DTS作业,每个表都有一个单独的盒子行框。我宁愿使用一个更容易维护的方法,用代码编写,而不是行和框。 (是的,我知道SSIS行和框被翻译成XML,但这对我来说很难读写。)
我无法使用Linked Server或OPENROWSET,因为我的SS2008服务器作为64位进程运行,因此OLEDB Jet驱动程序不可用。 OLEDB MSOffice ACE 12.0驱动程序是64位的,但它不应该与数据库服务器一起使用,因为它不是线程安全的(根据微软的说法)。此外,尽管进行了广泛的研究,我仍然无法在SS2008中使用它(“无法找到可安装的ISAM”)。我可以在32位程序(如SSIS)中使用OLEDB Jet读取Access表。
所以,我正在寻找一种现代的,非盒式的,优雅的32位解决方案,将表格从Access mdb / mdw文件复制到SS2008。
我可以这样做:
这个问题有几个密切的重复(Copy access database to SQL server periodically,Migrating Access Tables to SQL Server - Beginner),但没有一个涉及使OPENROWSET / Linked Server成为非选项的32位限制。
答案 0 :(得分:2)
您可以使用VBA从Access内部执行此操作,如下所示:
Public Function CopyTableDataToSqlServer()
Dim tbd As DAO.TableDef, qdf As DAO.QueryDef, connStr As String
connStr = _
"ODBC;" & _
"Driver={SQL Server};" & _
"Server=.\SQLEXPRESS;" & _
"Database=cloneDB;" & _
"Trusted_Connection=yes;"
For Each tbd In CurrentDb.TableDefs
If Not ((tbd.Name Like "MSys*") Or (tbd.Name Like "~*")) Then
Debug.Print tbd.Name
Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = connStr
qdf.SQL = "DELETE FROM [" & tbd.Name & "]"
qdf.ReturnsRecords = False
qdf.Execute
Set qdf = Nothing
CurrentDb.Execute _
"INSERT INTO [" & connStr & "].[" & tbd.Name & "] " & _
"SELECT * " & _
"FROM [" & tbd.Name & "] ", _
dbFailOnError
End If
Next
Set tbd = Nothing
Debug.Print "Done."
End Function
答案 1 :(得分:1)
我投了一些C#的东西。如果你有大表,你可能需要注意内存使用情况。
基本理念是这样的:
foreach(tableName in access)
get the table from access
optionally clear the target table
sqlbulkcopy it to target database
更复杂的解决方案是获取两个表并仅更新已更改的行。