将 MS ACCESS 数据库表导入 SQL Server

Posted

技术标签:

【中文标题】将 MS ACCESS 数据库表导入 SQL Server【英文标题】:Import MS ACCESS database tables into SQL server 【发布时间】:2020-04-09 14:22:33 【问题描述】:

我正在尝试将 MS Access 表导入 SQL 服务器。

我尝试了两种方法:

1)当我按照 SQL server 中的步骤操作时 => 右键单击​​数据库名称 => 任务 => 导入数据...我将能够成功导入表。

(这是我提到的网站:https://help.avalara.com/Frequently_Asked_Questions/Rate_Files_FAQ/How_do_I_import_MS_Access_database_into_a_SQL_Server_database%3F)

但它正在删除所有主键和外键约束。

它只是导入表列而不是键约束。我希望将所有主键和外键应用于列,就像它在 MS Access 中一样。

2) 使用 SSMA(如本网站所示:https://support.office.com/en-us/article/migrate-an-access-database-to-sql-server-7bac0438-498a-4f53-b17b-cc22fc42c979)。但是 SSMA 版本和 SQL Server 不匹配,我必须重新安装更高版本的 SQL Server。

有没有更简单的方法可以将所有这些表连同键约束一起导入 SQL Server? 请帮忙。

提前致谢。

【问题讨论】:

你知道你可以使用openquery直接从访问表中选择吗? 【参考方案1】:

您没有提及您拥有的 Access 版本。而且您也没有提及您拥有的 SQL Server 版本。对于任何最新的 SQL 服务器相关版本,您应该能够使用 + 运行 SSMA。它确实/让您可以选择要使用的 SQL Server 版本。在 Access 2010 之前(包括 Access 2010),有一个“内置”数据库导出可与 SQL Server 一起使用,但在 Access/office 2010 之后,您必须使用 SSMA,因为 access 中内置的 sql 迁移工具已被删除。

所以,您注意到由于某种原因您不能使用 SSMA,但没有提及您使用的是什么版本的 access/sql 服务器,那么我们的手(和建议)就被绑在这里了。

【讨论】:

您好,我有 MS Access 2010(64 位)、SQL Server Management Studio 2014(64 位)和用于 Access 2017 v8.8.0 的 SSMA。 如你所说,我尝试直接从 Access 导出数据库表。有效!!非常感谢!【参考方案2】:

希望这会有所帮助,即使它是一个简单的模板。

我不得不将许多公司的访问数据库迁移到 sql server。我什至构建了工具来协助这个过程。这是一个巨大的颈部疼痛,但在实际工作方面并不十分困难。您可以编写 vba 代码来轻松获取表定义,然后构建此模板将是一项简单的任务。

IF OBJECT_ID('tempdb..#yourtableinAccess') IS NOT NULL
    DROP TABLE #yourtableinAccess;

CREATE TABLE #yourtableinAccess
    (
        --Model After your local access table
    );
CREATE TABLE yourtableinSQL
    (
        --Model After your local access table
    );

INSERT INTO #yourtableinAccess
SELECT 
    -- build your select statement
    -- be conscious of autoincrements and what not. 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'UNC PATH TO YOUR ACCESS FILE';'admin';'', YourAccessTableName)

MERGE yourtableinSQL AS TargetTable
USING #yourtableinAccess AS SourceTable
    ON TargetTable.PRIMARYKEY = SourceTable.PRIMARYKEY
WHEN MATCHED
    AND (
        ISNULL(TargetTable.COLUMN, 0) <> ISNULL(SourceTable.COLUMN, 0)
        OR ISNULL(TargetTable.COLUMN, 0) <> ISNULL(SourceTable.COLUMN, 0)
        -- etc etc etc
        -- note isnull might not be appropriate. Just review your data structure
        )
    THEN
        UPDATE
        SET 
            TargetTable.[COLUMN] = SourceTable.[COLUMN]
            ,TargetTable.[COLUMN] = SourceTable.[COLUMN]
            -- etc etc etc
            -- build your data structure here too
WHEN NOT MATCHED
    THEN
        INSERT 
            (

            )
        VALUES 
            (

            );

注意 - 我使用了 merge 语句,因为我需要在每个表的迁移过程中获取数据的增量,因此简单的插入操作是不够的。

无论如何,编码愉快!

【讨论】:

以上是关于将 MS ACCESS 数据库表导入 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

使用 c# 将 MS Access 表数据添加到 SQL Server 表中

在 MS Access 2007 中对 ODBC 表导入 sql 查询

MS Access:来自 SQL Server 的只读链接表?

如何通过编码将数据从 MS Access 导入 Sql Server [关闭]

使用 python 将 pandas 数据框导入 MS Access 表

自动将新数据从 MS Access 数据库导入 SQL Server