代码之家  ›  专栏  ›  技术社区  ›  mr_miles

SQL Server:用于批量加载的唯一密钥

  •  1
  • mr_miles  · 技术社区  · 16 年前

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

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

    我的问题是,有没有办法避免将loadId传回源系统?例如,我设想我可以从SQLServer获得某种连接Id,我可以用它在loads表中查找相关的loadId。但是我不确定SQLServer是否有一个连接所特有的变量?

    有人知道吗?

    谢谢,

    3 回复  |  直到 16 年前
        1
  •  0
  •   Markus    16 年前

    我假设源系统正在将插入写入/提交到源表中,并且没有同时运行多个加载。。。

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

    如果您正在运行多个加载 同时在同一张桌子上

        2
  •  0
  •   SQLMenace    16 年前

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

        3
  •  0
  •   mr_miles    16 年前

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

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

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

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

    很有魅力,包括

    推荐文章