将多个Access数据库合并到SQL Server中

时间:2010-07-12 20:58:59

标签: sql-server ms-access import

我们有一个程序,每个用户都有自己的Access数据库。我们想将它们合并到一个SQL Server数据库中。

问题是,使用SQL Server导入/导出向导,主/外键不会更新。因此,例如,如果一个用户拥有此表:

1  Apple
2  Banana

另一位用户有这个:

1  Coconut
2  Cheeseburger

结果表如下所示:

1  Apple
2  Banana
1  Coconut
2  Cheeseburger

同样地,任何通过其主键(2)引用香蕉的东西现在都引用香蕉和芝士汉堡,这不会让素食主义者非常高兴。

导入时是否有任何方法可以自动更新主/外键引用,而不是编写极长且复杂的导入脚本?

4 个答案:

答案 0 :(得分:0)

如果需要将它们完全划分,则必须为每个表分配某种分区列。您是否有理由要求SQL Server具有与Access相同的参照完整性?您是否只是导入SQL Server以进行只读报告?在那种情况下,我不会打扰RI。查询都需要partitionid / siteid / customerid。您可以通过使用需要partitionid的表值UDF包装表来强制执行单实体访问。对于不起作用的跨站点。

如果您只是加载到SQL Server进行报告,我还会考虑更改数据模型以支持报告(即维度模型有时比标准化模型更好),而不是担心事务处理。

我认为我们需要更多地了解基本目标。

答案 1 :(得分:0)

需要更多有关要求的信息。

我的基本问题是'您是否需要保留原始记录密钥?'例如1:用户数据库A的表T中的apple; 1:用户数据库B的表T中的椰子。假设表T在所有数据库实例中具有相同的结构。我可以假设您可能希望保留原始数据的原因:(a)您可能需要引用原始数据(可能是以前报告的可视化),和/或(b)可能存在数据依赖性应用程序本身。

如果答案为“否”,那么您可能只对保留所有不同的数据值感兴趣。允许SQL表使用新密钥进行构建,并约束SQL表字段,使其包含唯一数据。这种方法似乎保留了原始表结构(但不是原始键值或其“位置”),并且可能足以满足您的要求。

如果答案为'是',我没有看到创建索引的方法,该索引保留指向原始数据库的指针和在其表T中创建的密钥。这种方法似乎需要修改应用程序。

在这种情况下,最好的方法可能是将传入的数据分成两个表:一个用于标识数据库和原始密钥,另一个用于标识不同的数据值。例如:(数据库)表D具有诸如'A:1:a','A:2:b,''B:1:c,''B:2:d,''B:15:a的记录,''C:8:a'; (数据)表T1有记录如'a:apple','b:banana,''c:coconut,''d:cheeseburger'其中'A'描述了原始数据库的位置,'1是原始值位置“A”和“a”是一个等于表D和表T1中记录的值。 (否则你在一个表中有很多冗余数据;例如A:1:apple,B:15:apple,C:8:apple。)另外,T1的结构与原始T类似,似乎是在应用程序中更直接有用。

答案 2 :(得分:0)

结束为此创建SSIS项目。 SSIS是由Microsoft (以及它们的“Business Integration Studio”的一部分,由SQL Server附带)制作的visual programming tool,旨在解决这些问题。

答案 3 :(得分:-1)

为什么不让Access使用其复制管理器来合并数据库?这将允许您在导入SQL Server之前识别冲突并解决它们。我相信它会保留外键关系。如果我正确理解您的情况,并且数据库是具有不同数据的相同结构,您可以将组合数据库加载到应用程序并在移动到SQL Server之前验证数据。

您使用的是什么版本的Access?这是Access 2000的链接。使用该语言调整搜索参数以适合您的版本。

http://technet.microsoft.com/en-us/library/cc751054.aspx