将Access数据库中的非规范化数据迁移到SQL Server数据库中的规范化表单的最有效方法

时间:2017-09-14 22:11:52

标签: sql-server tsql ms-access database-migration sql-server-migration-assi

我已经对这个话题进行了一段时间的研究,似乎无法找到与我的问题相似的实例。我会尽可能地尽力解释一切,就像我能做的那样。

问题在于标题;我正在尝试将数据从Access数据库迁移到SQL Server。通常,这不是一个真正的难题,因为SQL Server中存在多个导入/导出工具,但我正在寻找最佳解决方案。那个或一些建议/技巧,因为我对数据库迁移有些新意。我现在开始解释我的情况。

所以我目前正在以非规范化的形式迁移存在于Access“数据库”(引号中的数据库,因为我认为它实际上不是数据库,你会在一分钟内知道原因)中存在的数据。非规范化的意思是所有数据都在一个表中。该表有大约150多列,行数为数千。哎呀,我知道;这就是我走进大声笑。无论如何,坐下来整理所有内容,我已经为数据设计了关系,在新的家庭SQL Server中很好地规范了它。输入我的困境(或至少部分困境)。我已经设置了标准化数据库来保存数据但是我不确定如何导入它,按下/剪切它,并将它放在我设置的相应表中。

到目前为止,我已经对可以做什么以及我发现有关SQL Server迁移助手的初学者进行了大量研究。我已经开始弄乱它了,并且能够将数据从Access导入到SQL Server中,但不能按照我想要的方式导入。我得到的只是一个简单的副本&将数据粘贴到我的SQL Server数据库中,就像在Access数据库中一样。然后我了解了为这种类型的迁移设置全局表/暂存区域的典型做法,但在使用TSQL时我有点新手。我的问题的核心归结于此; SQL Server(其导入/导出工具或SSMA)中是否有一些功能允许我将数据发送到我的规范化SQL Server数据库中已存在的正确表中?或者我是否导入到临时区域并编写脚本以剖析数据并将其提取到相应的规范化表格?如果是后者,有人可以向我展示一些TSQL在做这类事情时会有什么样的提示/示例。显然,我不能指望没有我共享数据的任何人的确切脚本(我没有自由,因为它是客户数据),因此一些cookie切割器示例将起作用。

此外,未来的数据将从各种来源进入新数据库(例如,可能是excel),因此需要牢记这一点。我不想创建一个新问题,每次有人想要向数据库添加数据时,都必须编写新的导入,排序和存储脚本。

希望这不是太复杂,有人愿意(并且有能力)帮助我。我非常感谢任何建议/提示。我相信这会帮助除了我之外的其他人,因为我发现很多其他人都在寻找类似的东西。此外,它可能导致TSQL专家显示此类数据迁移脚本的示例和/或如何使用其他人之前未使用过的工具存在的说明,或者文档中没有充分解释的功能/功能

谢谢,

4 个答案:

答案 0 :(得分:2)

我同意所有提到的方法:将数据加载到一个临时表(可能使用SSIS),然后使用T-SQL(可能包含在存储过程中)将其粉碎。

这是一项需要手工编写脚本的自定义工作。没有自动化工具,因为源模式和目标模式都是自定义模式。所以你需要定义所有的映射和​​规则,而且没有 SSIS不会神奇地做到这一点!

听起来你有一个目标模式,源模式和目标模式之间的映射已经解决了

作为示例,您的第一步是使用此类查询加载“查找”表:

INSERT INTO TargetLookupTable1 (Field1,Field2,Field3)
SELECT DISTINCT Field1,Field2,Field3
FROM SourceStagingTable

TargetLookupTable1应该已经定义了一个身份主键(在上面的查询中没有提到,因为它是自动生成的)

这是您可以找到第一个问题的地方。您几乎肯定会发现您的独特查询只会为您提供大量重复的mispelt数据垃圾数据。因此,在加载查找表之前,您需要进行数据清理。

我建议您直接清理源系统中的数据,但这取决于您使用它的程度。

下一步是:假设您的数据全部干净,并且您已经以这种方式加载了十几个查找表..

现在您需要加载事务,但您不知道刚刚生成的查找键!

诀窍是在您的临时表中预先包含一个空列以记录此

加载查找表后,您可以将密钥写回登台表。此查询与您用于加载查找的字段匹配,并将密钥写回登台表

UPDATE TGT
SET MyNewLookupKey = NewLookupTable.MyKey
FROM SourceStagingTable TGT
INNER JOIN
NewLookupTable 
ON  TGT.Field1 = NewLookupTable.Field1
AND TGT.Field2 = NewLookupTable.Field2
AND TGT.Field3 = NewLookupTable.Field3

现在,您的临时表中有一个名为MyNewLookupKey的列,其中包含要加载到事务表中的正确查找键

正在进行的数据上传是一个单独的问题,但您可能想要调查MS Access数据项目(尽管它们显然已被逐步淘汰,但它们对于SQL Server的前端非常方便)

要记住的是:如果你的数据有任何含糊之处,例如,“这些行说我的车是黑色的,但这些行说我的车是白色的”,那么你(一个人)需要拿出来“消除歧义”的规则。它无法自动完成。

答案 1 :(得分:1)

所以有很多方法可以给这只猫留下皮肤。我不太了解“移民助理”,但我怀疑它会让你的生活更轻松,因为你正在尝试做什么。

我只是将整个非规范化的混乱转储到一个大的临时表中,然后使用SQL将其粉碎到需要它的位置。我知道你在TSQL上寻求帮助,但是我不知道非规范化数据是什么以及你想如何重新塑造它,我所能做的就是建议你阅读一般的SQL(select,from,from,在哪里,分组等)。

您也可以在SSIS中完成工作,但最终您使用的解决方案在很大程度上取决于您需要如何规范化大规范非规范化数据集的性质。恕我直言在SQL中这样做通常是最简单的方法,但是当你成为锤子时,一切看起来都像钉子一样。

就未来验证流程而言,如何导入Access数据可能与您导入Excel数据的方式无关。如果您需要定期合并大量不同的数据源,那么从长远来看,SSIS可能是投入一些时间和精力的好选择。无论如何,合并来自不同数据源的数据需要花费时间和精力。无论如何,你都要做一些额外的工作。我会重视您认为必须集成给定数据源的频率,以及将其按照您想要的格式进行操作需要花费多少精力。

答案 2 :(得分:1)

首先:

  

此外,未来的数据将从新数据库进入   各种来源(例如可能excel)......?

这就是SSIS的用途。建立SSIS不是一项微不足道的任务,但它也不是火箭科学。 SQL Server Management Studio具有导入/导出向导,这是一个易于使用的SSIS包创建者。那会让你开始。有许多替代品,如Powershell,但SSIS是最快,最简单的解决方案IMO。特别是在处理来自多个来源的数据时。

SSIS可以很好地与Microsoft产品一起作为数据源(例如Excel和Sharepoint)。

对于某些事情,您可以创建一个MS Access前端,通过SQL Server存储过程与SQL Server连接。这取决于目标受众。这很容易设置。快速谷歌搜索将返回许多简单的例子。这实际上是我20多年前学习SQL服务器的方式。

  

SQL Server中是否有一些功能允许我发送   数据到我的规范化SQL中已存在的右表   服务器数据库?

是的,不是。对于你所描述的内容,这将是令人沮丧的。

  

或者我是否导入到临时区域并编写脚本以进行剖析   并将数据提取到相应的规范化表?

此。

  

如果是后者,有人可以给我一些提示/示例   TSQL会做什么样的事情。

在处理非规范化数据时,好的分离器很重要。这是我的两个最爱: DelimitedSplit8K

PatternSplitCM

在SQL Server 2016中,您还有split_string,它更快(但有问题)。

另一个必须具备良好的NGrams功能。我发布的链接在文章的底部附加了该功能。我有一些字符串清理功能here

我发布的链接有一些很好的例子。

答案 3 :(得分:0)

我有完全不同的意见。因为我同时进行数据库开发和Microsoft的Power BI - 在PBI方面我们遇到了很多非规范化数据,因为很多数据来自excel。

我的猜测是,Access中现在的内容是最初以excel开头的内容的导入。

Excel Power Query和PBI提供转换到pivot和unpivot布局。我会使用这些工具来完成这项任务。然后将结果导入SQL。