sql-server - 使用 Guid 维护数据库中的键与使用整数的另一个键之间的数据库关系

标签 sql-server ms-access guid etl

我正在尝试编写一个应用程序,该应用程序将从 SQL Server 数据库中取出信息,通过 Web 服务加载对象模型,然后将该信息传递到 Access DB 中,该数据库基于与 SQL Server 不同的架构数据库,但包含的信息是相同的(所以我认为这类似于 ETL 过程)。我遇到的问题是我提取信息的数据库中的主键(SQL Server)是 GUID,而我将它们放入(Access)的数据库是 INT。例如:

表 1,SQL Server 中的人员表:

╔══════════════════════════════════════╦══════════╦════════════╗
║                  ID                  ║   Name   ║ CreatedOn  ║
╠══════════════════════════════════════╬══════════╬════════════╣
║ 3648F6BB-F743-4952-9C69-93336667F3B1 ║ Person 1 ║ 01/01/2012 ║
║ DE44577A-CAE7-4101-B962-C052214E723B ║ Person 2 ║ 02/01/2012 ║
║ 94115C5E-9C7E-40CF-8A87-D4D837BD5DB3 ║ Person 3 ║ 03/01/2012 ║
║ F93E77D9-C344-420C-9499-BA3B4DD0F0BA ║ Person 4 ║ 04/01/2012 ║
╚══════════════════════════════════════╩══════════╩════════════╝

表 2, Access 中的人员表:
╔════╦══════════╦════════════╗
║ ID ║   Name   ║ CreatedOn  ║
╠════╬══════════╬════════════╣
║  1 ║ Person 1 ║ 01/01/2012 ║
║  2 ║ Person 2 ║ 02/01/2012 ║
║  3 ║ Person 3 ║ 03/01/2012 ║
║  4 ║ Person 4 ║ 04/01/2012 ║
╚════╩══════════╩════════════╝

所以表 1 是数据在 SQL Server 数据库中的返回方式,表 2 是信息在 Access 数据库中的显示方式。所以所有的 GUID 都应该是整数,但数据之间的关系应该保持不变。例如,如果我在 SQL Server 和 Access 中运行查询以获取此人的地址(地址表的设置也类似),则无论是否使用 GUID 或整数,该查询都应返回相同的结果。

我在想的是在 SQL Server 中使用 ROW_NUMBER(),按 CreatedOn 日期排序(这是数据库中的日期时间类型,因此,在所有记录中应该是唯一的):
SELECT 
  (ROW_NUMBER() OVER (ORDER BY CreatedOn)) AS ID,
  Name,
  CreatedOn
FROM Table2;

唯一的问题是我看到查询返回了重复的整数 ID。因此,例如上面的表 1 将如下所示:
╔════╦══════════╦════════════╗
║ ID ║   Name   ║ CreatedOn  ║
╠════╬══════════╬════════════╣
║  1 ║ Person 1 ║ 01/01/2012 ║
║  2 ║ Person 2 ║ 02/01/2012 ║
║  1 ║ Person 3 ║ 03/01/2012 ║
║  1 ║ Person 4 ║ 04/01/2012 ║
╚════╩══════════╩════════════╝

当每个 ID 应该是唯一的。任何人都可以想出一个好方法来做我想要完成的事情吗?我目前尝试这样做的方式有什么问题吗?

任何帮助将不胜感激。

最佳答案

我不会依赖 ROW_NUMBER()如果我是你,因为你可能无法确定顺序总是相同的:

首先,在您的示例中,您仅显示 CreatedOn 的日期值(没有时间)。柱子。如果在同一天创建了多个人,那么如果您在该日期之前订购,则无法确定谁先出现。
即使你真的有时间在 CreatedOn列 - 如果一个人从表中删除,ROW_NUMBER所有随后的人都会改变。

最简单的解决方案是更改其中一个表,就像 webturner 在 his answer 中已经建议的那样。 .
如果由于任何原因您不能这样做(例如,如果根本不允许您更改任一数据库的架构,或者如果更改表的架构,遗留的东西会破坏),您可以创建一个映射存储两个表之间关系的表:

╔══════════════════════════════════════╦══════════╗
║             SqlServerID              ║ AccessID ║
╠══════════════════════════════════════╬══════════╣
║ 3648F6BB-F743-4952-9C69-93336667F3B1 ║    1     ║
║ DE44577A-CAE7-4101-B962-C052214E723B ║    2     ║
║ 94115C5E-9C7E-40CF-8A87-D4D837BD5DB3 ║    3     ║
║ F93E77D9-C344-420C-9499-BA3B4DD0F0BA ║    4     ║
╚══════════════════════════════════════╩══════════╝

如果不允许更改现有数据库,您甚至可以将其放入第三个数据库中。

关于sql-server - 使用 Guid 维护数据库中的键与使用整数的另一个键之间的数据库关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10484046/

相关文章:

c# - 如何在数据库中保存未知属性?

java - 应用程序不会写入 MS DB

sql - MS-Access SQL 条件过滤困难

hash - GUID 的哈希值是否唯一?

sql - 您可以使用 IS NOT NULL 和通配符作为搜索参数吗

sql - 在 t-sql 中验证日期?

sql - 如何更新数据库中所有表的特定列值

ms-access - Access 查询错误 - 空和变体数据类型 - 如何修复此错误?

sql - 将 Raw(16) 转换为 GUID

c++ - 如何生成 24 个字符的 UUID?