0

我一直在对此主题进行一些研究,似乎无法找到类似的实例我的问题。尽我所能,我会尽我所能地尽力解释一切。将Access数据库中的非规范化数据迁移到SQL Server数据库中规范化形式的最有效方法

问题出在标题上;我正尝试将数据从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专家显示此类数据迁移脚本的示例和/或解释如何使用其他人以前未使用过的方法存在的工具,或者在文档中没有充分说明功能/功能。

谢谢

大号

+2

IMO最好的选择是在SQL Server中导入表格,然后将数据手动移动到规范化的表格,因为使用TQL你有更多的选项来转换和分离数据(我并不是说有任何工具因为该工具知道如何“纠正”数据会非常困难)。 –

回答

1

第一本:

此外,未来的数据会从 各种渠道进入了新的数据库(如可能练成为例)...?

这就是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

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

1

因此,有相当多的方式去给这只猫的皮肤。我对“移民助理”了解不多,但我怀疑它会让你的生活更轻松,因为你正在努力做什么。

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

您也可以在SSIS中完成这项工作,但最终您使用的解决方案很大程度上取决于您如何规范大规格非规范化数据集的性质。恕我直言,在SQL中这样做通常是最简单的方法,但当你是锤子时,再一次看起来像钉子。就未来验证过程而言,如何导入Access数据可能不会影响您如何导入Excel数据。如果你有很多不同的数据源需要经常性地加入,SSIS可能是一个长期投入一些时间和精力的好选择。无论如何,合并来自不同数据源的数据都需要时间和精力。无论如何,你都必须做一些额外的工作。我会重复你认为你需要整合一个给定数据源的频率,以及需要花费多少精力将其按照你想要的格式进行按摩。

2

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

这是一个需要手工构建脚本的自定义作品。有没有自动化的工具,因为你的源和目标模式都是自定义模式。所以你需要定义所有的映射和​​规则somewhow ....和没有 SSIS不神奇地做到这一点!

这听起来像你有一个目标架构和源和目标模式之间的映射已经摸索出

举个例子你的第一步是载入“查找”表与此类型的查询:

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

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

在这里,你会发现你的第一个问题。你几乎肯定会发现你的独特查询只会给你一大堆重复的错误数据垃圾数据。所以在你加载你的查询表之前,你需要做数据清理。

我建议您直接清理源系统中的数据,但这取决于您对此有多舒服。

下一步是:假设你的数据都是干净的,你已经以这种方式加载十几查找表..

现在你需要加载的交易,但你不知道查找键,您只需产生!

关键是要预先在您的临时表一旦你已经装载了你的查找表,您可以将密钥写入回临时表来记录这个

这一个空列。此查询匹配回你用来加载查询的字段,并写入键返回到临时表

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中非常方便)

需要记住的是:如果您的数据有任何不明确的地方,充足“,这些行说我的车是黑色的,但这些行说我的车是白色的”,那么你(一个人)需要提出一个“消歧”的规则。它不能自动完成。

0

我有一个完全不同的意见。因为我同时进行数据库开发和微软的Power BI--在PBI方面,我们遇到了很多非标准化的数据,因为很多数据都来自于excel。

我的猜测是现在在Access中的东西是最初在Excel中开始的东西的导入。

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