1

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

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

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

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

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

希望这不会太令人费解,并且有人愿意(并且能够)帮助我。我将不胜感激任何建议/提示。我相信这会对我以外的其他人有所帮助,因为我发现很多其他人都在寻找类似的东西。此外,它可能会导致 TSQL 专家展示此类数据迁移脚本的示例和/或解释如何使用以其他人以前未使用过的方式存在的工具或文档中未充分解释的功能/能力.

谢谢,

大号

4

4 回答 4

2

首先这个:

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

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

SSIS 与 Microsoft 产品作为数据源(如 Excel 和 Sharepoint)很好地配合使用。

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

SQL Server 中是否有一些功能允许我将数据发送到规范化 SQL Server 数据库中已经存在的正确表?

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

或者我是否导入到暂存区并编写脚本来剖析数据并将数据提取到相应的规范化表中?

这个。

如果是后者,有人可以向我展示一些 TSQL 看起来像做这种事情的提示/示例。

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

模式分割CM

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

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

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

于 2017-09-15T03:09:29.737 回答
2

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

这是一项需要手工构建脚本的自定义工作。没有用于此的自动化工具,因为您的源模式和目标模式都是自定义模式。所以你需要以某种方式定义所有的映射和​​规则......而且没有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 的前端非常方便)

要记住的是:如果您的数据有任何模棱两可之处,例如,“这些行说我的车是黑色的,但这些行说我的车是白色的”,那么您(人类)需要为“消除歧义”。它不能自动完成。

于 2017-09-15T03:31:24.400 回答
1

所以有很多方法可以给这只猫剥皮。我对“迁移助手”知之甚少,但我怀疑它是否会让你的生活更轻松,因为你正在尝试做些什么。

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

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

就未来验证过程而言,您如何导入 Access 数据可能对您如何导入 Excel 数据影响不大。如果您有大量不同的数据源需要经常合并,那么从长远来看,SSIS 可能是一个不错的选择,可以投入一些时间和精力。无论如何,合并来自不同数据源的数据都需要时间和精力。无论如何,您都必须做一些额外的工作。我会权衡您认为必须集成给定数据源的频率,以及将其按摩成您想要的格式所涉及的工作量。

于 2017-09-14T22:27:14.927 回答
0

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

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

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

于 2017-09-21T18:56:40.723 回答