将 Microsoft Access 数据库迁移到 SQL Server Compact Edition 4.0

Migrate Microsoft Access Database to SQL Server Compact Edtion 4.0

我创建了一个使用 Microsoft Access 数据库的应用程序,但我遇到了一些问题,因此想迁移到 Microsoft SQL Server Compact Edition。

我研究了几种工具,但目前找不到任何可以将 Access 数据库转换为 SQL CE 的工具。有没有人对快速重新创建表格或 links 我可以使用的软件工具有任何建议?最好是免费解决方案,或者非常便宜(>50 英镑?)

我试过:

正如我在上面的评论中所说,我必须记住我以前是怎么做到的。

我使用(现在仍然使用)SQL Server Express Edition,可免费下载。我不确定它与您所指的精简版之间的区别。我也不确定你的限制是什么,所以这可能不适合你但是...

步骤 1) 安装 SQL Server Express 和 SQL Server Management Studio。进来一个单一的包装。我认为你必须自己获得一个 Microsoft 帐户才能下载它

步骤 2) 创建一个新数据库以将您的访问数据库导入

步骤 3) 在这个新数据库中选择 tasks/import 数据

步骤 4) Select 作为源访问(选择文件),目标 SQL 服务器本机客户端(和 select 您所在的数据库)

步骤 5) 整理。我必须创建 运行 一些脚本来复制 table,将 Autonum 主键设置为正确的值等等。最后我创建了几个存储过程来帮助我。

Here.s一个。具体的我记不清了,你们随意吧

-- =============================================
-- Author:      Alan Chandler
-- Create date: 10th May 2011
-- Description: Migrates a single table (passed as a parameter) to database
-- =============================================
CREATE PROCEDURE [dbo].[MigrateTable] 
    -- Add the parameters for the stored procedure here
    @table_name sysname
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SET @table_name = RTRIM(@table_name)
    DECLARE @cmd AS NVARCHAR(max)
    DECLARE @column_name AS NVARCHAR(max)
    DECLARE @object_id AS int
    DECLARE @has_identity AS int
    DECLARE @comma_needed AS bit
    DECLARE column_list_cursor CURSOR READ_ONLY FOR
        SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @table_name ;

    -- Insert statements for procedure here
    -- Do Complete Process as a transaction in case it goes wrong
    BEGIN TRANSACTION
    SELECT @object_id = OBJECT_ID(QUOTENAME(@Table_name))
    SELECT @has_identity = ISNULL(OBJECTPROPERTY(@object_id,'TableHasIdentity'),0)
    SET @cmd = N'DELETE FROM '+QUOTENAME(@table_name)
    EXEC sp_executesql @cmd
    SET @cmd = N'';
    IF @has_identity > 0 
    BEGIN
        -- If We Have an Identity Column we need to allow the insertion without thinking about it
        SET @cmd = N'SET IDENTITY_INSERT '+QUOTENAME(@table_name)+N' ON;'
    END
    -- Create an Insert Statement ...
    SET @cmd = @cmd+N'INSERT INTO [dbo].'+QUOTENAME(@table_name)+N' (';
    -- ... Listing all the column names
    OPEN column_list_cursor;
    SET @comma_needed = N'FALSE'
    FETCH NEXT FROM column_list_cursor INTO @Column_name
    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @comma_needed = N'TRUE' SET @cmd = @cmd + N',';
        SET @cmd = @cmd + QUOTENAME(@Column_name)
        SET @comma_needed = N'TRUE';
        FETCH NEXT FROM column_list_cursor INTO @Column_name
    END
    SET @cmd = @cmd+N') SELECT '
    -- Now start to create the Select Statement from the other database ...
    SET @comma_needed = N'FALSE'
    CLOSE column_list_cursor;
    -- ... again listing all the column names
    OPEN column_list_cursor;
    FETCH NEXT FROM column_list_cursor INTO @Column_name
    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @comma_needed = N'TRUE' SET @cmd = @cmd + N',';
        SET @cmd = @cmd + QUOTENAME(@Column_name)
        SET @comma_needed = N'TRUE';
        FETCH NEXT FROM column_list_cursor INTO @Column_name
    END
    CLOSE column_list_cursor
    DEALLOCATE column_list_cursor
    SET @cmd = @cmd + N' FROM [Accuvision].[dbo].'+QUOTENAME(@table_name)+N';'
    IF @has_identity > 0 
    BEGIN
        -- Switch identity function back on and reseed the value
        SET @cmd = @cmd+N'SET IDENTITY_INSERT '+QUOTENAME(@table_name)+N' OFF;'
        SET @cmd = @cmd+N'DBCC CHECKIDENT ('+QUOTENAME(@table_name)+N',RESEED)'
    END
    EXEC sp_executesql @cmd
    COMMIT
    PRINT N'Migration of '+QUOTENAME(@table_name)+N' complete'
END

这是从第二个程序调用的。我不能 post 所有这些,因为我所做的清理工作是保密的,但通用位如下..

-- =============================================
-- Author:      Alan Chandler
-- Create date: 10th May 2011
-- Description: Migrates Accuvision Database (itself imported
--              from an access database of the same name) into
--              the current database, avoiding IDENTITY ISSUES
-- =============================================
CREATE PROCEDURE [dbo].[Migrate] 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @Table_Name nvarchar(max);
    DECLARE table_list_cursor CURSOR FORWARD_ONLY READ_ONLY FOR
        SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = N'BASE TABLE';
    -- Turn off contraint checking on all tables
    EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

    OPEN table_list_cursor;
    FETCH NEXT FROM table_list_cursor INTO @Table_name
    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @Table_Name NOT IN ( N'WebSiteLeads', N'Debug_Log', N'Config',N'People',N'UserLog',N'ProcedureType',N'DailyDates',N'Locks',N'CallLog')
            EXEC [dbo].[MigrateTable] @Table_name
        FETCH NEXT FROM table_list_cursor INTO @Table_name
    END
    CLOSE table_list_cursor;
    DEALLOCATE table_list_cursor;

--- Lots of calls to 
    SET IDENTITY_INSERT [XXXX] ON;
-- do stuff to table
    SET IDENTITY_INSERT [XXXX] OFF;
    DBCC CHECKIDENT ('XXXX',RESEED)
--
    PRINT N'Last Step, resetting constraints'
    EXEC sp_msForEachTable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"  
    PRINT N'DATA MIGRATION COMPLETE'    
END

希望对您有所帮助。对不起,如果没有,但正如你所看到的,这是将近 5 年前我创建了这些程序 - 使用了几次直到一切正常,我迁移了数据库并且直到现在才再次查看它们

如果您有安全问题等,请参阅 https://www.chandlerfamily.org.uk/2011/04/importing-access-database-into-sqlserver-when-the-former-is-protected-with-a-workgroup-file/

如果你想要一些备份程序等我把它们放在这里 https://www.chandlerfamily.org.uk/2011/05/an-automated-backup-regime-for-a-small-sql-server-database/

1:使用 SSMA 从 Access 迁移到免费的 SQL 服务器版本 (LocalDB / Express)

2:在 Visual Studio 2015 Community Edition(也是免费的)中,使用我的免费“SQL Server Compact Toolbox”从 SQL Server 数据库迁移到 SQL Compact(通过 "one-click" 或通过脚本)