将 Access 数据库中的 Un-Normalized 数据迁移到 SQL 服务器数据库中的规范化形式的最有效方法

Most Efficient Way to Migrate Un-Normalized Data in an Access Database to a Normalized Form in a SQL Server Database

我已经对这个主题进行了一段时间的研究,但似乎找不到与我的问题类似的实例。我会尽我所能,尽可能简单地解释一切。

标题有问题;我正在尝试将数据从 Access 数据库迁移到 SQL 服务器。通常,这并不是一个真正的难题,因为 SQL 服务器中存在多个 import/export 工具,但我正在寻找最佳解决方案。那个或一些 advice/tips 因为我对数据库迁移有些陌生。我现在开始说明我的情况。

所以我目前正在迁移存在于 Access“数据库”(引号中的数据库,因为我不认为它实际上是数据库,你很快就会知道为什么)中的数据 un-normalized表格。 un-normalized 的意思是所有数据都在一个 table 中。这个 table 有大约 150 多列和数千行。哎呀,我知道;这就是我走进去的地方,哈哈。无论如何,坐下来整理所有内容,我为数据设计了关系,可以在新家 SQL 服务器中很好地规范化数据。输入我的困境(或至少是其中的一部分)。我设置了规范化数据库来保存数据,但我不确定如何导入它,massage/cut 并将其放置在我设置的相应 table 中。

到目前为止,我已经对可以做什么进行了大量研究,对于初学者,我发现了 SQL 服务器迁移助手。我已经开始弄乱它并能够将数据从 Access 导入 SQL 服务器,但不是我想要的方式。我得到的只是将数据直接复制并粘贴到我的 SQL 服务器数据库中,就像在 Access 数据库中一样。然后我了解了为此类迁移设置全局 table/staging 区域的典型做法,但在使用 TSQL 时我有点新手。我的问题的核心归结为这一点; SQL 服务器(它的 import/export 工具或 SSMA)中是否有一些功能可以让我将数据发送到我的规范化 [=40] 中已经存在的正确 tables =] 服务器数据库?或者我是否导入到暂存区并编写脚本来剖析数据并将其提取到相应的规范化 table?如果是后者,有人可以告诉我一些 tips/examples TSQL 做这种事情的样子。显然,如果没有我共享数据(我没有自由,因为它是客户数据),我不能指望任何人提供准确的脚本,所以一些千篇一律的例子会起作用。

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

希望这不是太复杂,有人愿意(并且能够)帮助我。我将不胜感激 advice/tips。我相信这会对我以外的其他人有所帮助,因为我发现很多其他人都在寻找类似的东西。此外,它可能会导致 TSQL 位专家展示此类数据迁移脚本的示例 and/or 解释如何使用其他人以前没有使用过或没有使用过的工具 functions/capabilities 文档中没有充分解释。

谢谢,

L

所以有很多方法可以给这只猫剥皮。我对 "Migration Assistant" 了解不多,但我怀疑它是否会让你的生活更轻松,因为你正在尝试做。

我只是将整个非规范化的混乱转储到一个大的舞台 table 中,然后使用 SQL 在需要的地方切碎它。我知道你在 TSQL 上寻求帮助,但不知道非规范化数据是什么以及你想如何重塑它,我所能做的就是建议你阅读 [=21] =] 一般(select、来源、位置、分组依据等)。

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

就未来验证过程而言,导入 Access 数据的方式可能与导入 Excel 数据的方式关系不大。如果您有大量不同的数据源需要经常合并,SSIS 可能是长期投入一些时间和精力的不错选择 运行。无论如何,合并来自不同数据源的数据都需要时间和精力。无论如何,您都必须做一些额外的工作。我会权衡您认为必须集成给定数据源的频率,以及将其整理成您想要的格式需要付出多少努力。

首先是这个:

Additionally, future data is going to come into the new database from various sources (like maybe excel for example)...?

这就是 SSIS 的用途。设置 SSIS 不是一项简单的任务,但也不是火箭科学。 SQL Server Management Studio 有一个 Import/Export 向导,它是一个易于使用的 SSIS 包创建器。那会让你开始。有许多替代方案,例如 Powershell,但 SSIS 是 IMO 最快和最简单的解决方案。尤其是在处理来自多个来源的数据时。

SSIS 与作为数据源的 Microsoft 产品(例如 Excel 和 Sharepoint)配合得很好。

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

Is there some feature in SQL Server that will allow me to send the data to the right tables that already exist in my normalized SQL Server database?

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

Or do I import to the staging area and write the script(s) to dissect and extract the data to the respective normalized table?

这个。

If it is the latter, can someone please show me some tips/examples of what the TSQL would look like to do this sort of thing.

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

PatternSplitCM

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

另一个必备就是好NGrams function. The link I posted has the function attached at the bottom of the article. I have some string cleaning functions here.

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

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

这是一件需要手工制作脚本的定制作品。没有用于此的自动化工具,因为您的源模式和目标模式都是自定义模式。因此,您需要以某种方式定义所有映射和规则……而且 no SSIS 不会神奇地做到这一点!

听起来您已经制定了目标模式和源模式与目标模式之间的映射

例如,您的第一步是使用这种查询加载 'lookup' tables:

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

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

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

我建议您直接清理源系统中的数据,但这取决于您对此的接受程度table。

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

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

诀窍是在您的暂存中为此预先包含一个空列table以记录此

加载查找后 table 您可以将密钥写回暂存 table。此查询匹配回您用于加载查找的字段,并将密钥写回暂存 table

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

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

持续上传数据是一个单独的问题,但您可能想调查一个 MS Access 数据项目(虽然它们显然正在被淘汰,但它们对于 SQL 服务器的前端来说非常方便)

要记住的是:如果您的数据有任何歧义,例如 "these rows say my car is black but these rows say my car is white",那么您(人类)需要为 "disambiguating" 制定一个规则。无法自动完成。

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

我的猜测是,现在 Access 中的内容是对最初开始于 excel 的内容的导入。

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