2010-07-06 96 views
1

我正在处理一个数据仓库项目,其中有多个系统正在将数据加载到暂存区域以供后续处理。每个表都有一个“loadId”列,它是针对“加载”表的外键,其中包含诸如加载时间,用户帐户等信息。SQL Server:批量加载的唯一键

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

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

有谁知道吗?

感谢,

回答

0

我假设源系统正在编写/犯插入到你的源表和多个载荷不会在同一时间运行...

如果是这样,有源负载调用存储过程,newLoadStarting(),在s之前负责处理加载过程。这个存储过程会更新一个加载表(创建一个新行,记录开始时间)

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

为了完整起见,您可以添加一个endLoading()proc,它设置结束日期并取消激活该特定负载。

如果您正在运行多个负载在同一表在同一时间...停止这样做......这不是非常有成效的。

+0

这几乎是我最后想到的,但通过锁定表足够了,我不再需要loadStarting sproc。 – 2010-08-23 09:59:38

+0

很高兴我能帮到你 – Markus 2010-09-03 14:29:59

0

本地临时表(用一个井号#TEMP)是唯一的会话,转储ID在那里,然后从中选择

顺便说一句,这只会如果使用工作相同的连接

+0

我想到了这一点,但临时表实际上是在它们超出范围时被丢弃的。当创建它们的存储过程完成时,它们超出范围。所以数据会丢失。 – 2010-07-06 17:41:14

+0

你需要在proc调用之前创建它们,然后调用procs ..我不知道你的过程如何工作,所以这可能不适合你 – SQLMenace 2010-07-06 17:52:48

0

最后,我去了以下解决方案“模式”,非常类似于马库斯是在暗示:

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

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

我还为每个源系统安排了自己的模式,这是它可以看到的唯一东西,也是它在登录时的默认模式。该视图和sproc位于此架构中,但基础表处于包含跨所有源的数据的“分段”架构中。我确保通过命名约定不会发生冲突。

工程像一个魅力,包括一个情况下,如果两个表已被更新只能完成加载。