每天将Access 97表复制到SQL Server 2008 R2 64位

时间:2013-06-15 23:39:47

标签: tsql ms-access sql-server-2008-r2 openrowset

我有一个古老的系统,它使用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。

我可以这样做:

  • 单个T-SQL脚本
  • 一些C#事物,它自省确定表结构,然后为每个表执行SQL
  • 一些魔法“将此OLEDB中的每个表复制到该SQL Server”包

这个问题有几个密切的重复(Copy access database to SQL server periodicallyMigrating Access Tables to SQL Server - Beginner),但没有一个涉及使OPENROWSET / Linked Server成为非选项的32位限制。

2 个答案:

答案 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

更复杂的解决方案是获取两个表并仅更新已更改的行。