【问题标题】:SQL Server: unique key for batch loadsSQL Server:批量加载的唯一键
【发布时间】:2010-07-06 17:32:37
【问题描述】:

我正在处理一个数据仓库项目,其中多个系统正在将数据加载到暂存区以进行后续处理。每个表都有一个“loadId”列,它是“loads”表的外键,其中包含加载时间、用户帐户等信息。

目前,源系统调用存储过程获取新的loadId,将loadId添加到将要插入的每一行,然后调用第三个sproc表示加载完成。

我的问题是,有没有办法避免将 loadId 传回源系统?例如,我想象我可以从 Sql Server 获取某种连接 Id,我可以使用它在负载表中查找相关的 loadId。但是我不确定Sql Server是否有一个连接唯一的变量?

有人知道吗?

谢谢,

【问题讨论】:

    标签: sql-server-2008 data-warehouse etl


    【解决方案1】:

    我假设源系统正在将插入写入/提交到您的源表中,并且多个负载不是同时运行...

    如果是这样,在启动加载过程之前,让源加载调用存储过程 newLoadStarting()。此存储过程将更新加载表(创建新行,记录开始时间)

    在您的 loadID 列上放置一个触发器,该列将从该表中获取 max(loadID) 并作为当前负载 ID 插入。

    为了完整起见,您可以添加一个 endLoading() 过程,它设置结束日期并停用该特定负载。

    如果您同时在同一张表中运行多个负载...停止这样做...效率不高。

    【讨论】:

    • 这几乎就是我最终所追求的,尽管通过充分锁定表,我消除了对 loadStarting sproc 的需要。
    【解决方案2】:

    本地临时表(带有一个井号#temp)对于会话是唯一的,将 ID 转储到那里然后从中选择

    顺便说一句,这仅在您使用相同的连接时才有效

    【讨论】:

    • 我想到了这一点,但是当临时表超出范围时,它们实际上会被删除。当创建它们的存储过程完成时,它们就会超出范围。所以数据会丢失。
    • 你需要在 proc 调用之前创建它们,然后调用 procs..我不知道你的进程是如何工作的,所以这可能不适合你
    【解决方案3】:

    最后,我选择了以下解决方案“模式”,与 Markus 的建议非常相似:

    • 我创建了一个带有 loadId 列的表,默认为 null(加上一些其他审计信息,如 createdDate 和 createdByUser);
    • 我在表上创建了一个视图,它隐藏了 loadId 和 audit 列,并且只显示了 loadId 为 null 的行;
    • 源系统将数据加载/查看到视图中,而不是表中;
    • 完成后,源系统调用“sp__loadFinished”过程,该过程将正确的值放入 loadId 列并执行其他一些日志记录(接收的行数、调用的日期等)。我是从模板生成的,因为它是重复的。

    因为 loadId 现在对所有这些行都有一个值,所以它不再对源系统可见,并且它可以在需要时启动另一个加载。

    我还为每个源系统安排了自己的模式,这是它唯一可以看到的,也是登录时的默认设置。视图和存储过程位于此模式中,但基础表位于包含所有源数据的“暂存”模式中。我通过命名约定确保没有冲突。

    就像一个魅力,包括 一个只有在两个表已更新时才能完成加载的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多