0

我们正在设计从 MAS200 等外部源将数据导入到我们的生产 SQL Server 2005/2008 数据库中。源将是一个事务性数据库并且是安全/隔离的。我们需要使我们的数据库与源保持同步,以便定期进行数据同步。

我们可以自由询问任何类型的源数据——比如 CSV、txt 文件的形式,或者甚至将源数据放在另一个具有类似结构的 SQL 数据库中。我们需要选择导入数据的最佳方式——它是周期性的,可以每小时或每天完成一次。

根据我的经验,我相信将源数据保存在 SQL 数据库中可能是最好的入门方式。这是迄今为止我们得出的粗略设计 -

  1. 定期源数据库将在外部填充(不是我们的部分)
  2. 预处理:抛光源表数据(即修剪、查找) - 通用数据格式化和转换
  3. Fetch:创建一个 CURSOR 来遍历记录。我们计划更新现有数据并插入新数据,因此我们将需要至少两个 CURSOR 循环一一进行。
  4. 填充:在 CURSOR 循环内记录将被更新/插入
  5. 后处理:再次进行一些最后的润色和查找映射(即用 id 替换代码)
  6. 检查:最后,对表进行一致性检查,以确保导入数据的完整性

总而言之,我们将打破存储过程中的步骤,然后创建一个 SQL 作业,将按照这些步骤一一进行。我知道有很多方法可以做到这一点,SSIS、数据导入向导等。但我们需要保持它非常简单、易于移植、更少依赖和灵活以应对未来的变化。

注意:数据将是巨大的 - 我们上次进行类似设置时需要几分钟(大约 20-25 分钟)才能完成整个数据导入过程,因此我们安排了每小时一次的数据导入。

谢谢你。


更新#1: 我知道使用 MERGE 命令似乎是最好的。但如果我必须为 SQL Server 2005 创建它?我相信它适用于 2008 年以后。我找到了一个链接-

http://sqlserver-tips.blogspot.com/2006/09/mimicking-merge-statement-in-sql.html

2005年还有什么想法吗?

4

3 回答 3

2

对于第 3 项和第 4 项 - 如果您使用的是 SQL Server 2008,请考虑使用 MERGE 命令而不是游标和循环

如果可能,请保留源数据库的原始副本,然后如果数据处理中出现任何问题,您可以更轻松地追查原因。

于 2011-11-16T13:49:28.220 回答
0

您是否考虑过使用SQL Server 集成服务?听起来您的项目非常适合它。

我最近从事一个项目,该项目从各种数据源(数据库和文件)中提取数据,对其进行聚合和清理,然后将其推送到关系 SQL Server 2008 数据库中。这在 SSIS 中非常简单。

于 2011-11-16T14:09:17.483 回答
0

正如其他人所说,在此过程中无需使用游标;我也同意 SSIS 可能比你想象的更适合这个(因为它是可移植和可配置的)。但是,如果您想在 T-SQL 中执行此操作,那么我建议您将 FETCH 步骤替换为以下内容:

  1. 从用于优化数据的临时表中提取数据。
  2. 如果你不能在 SQL 2008 中使用 MERGE 命令,你可以用一个 JOIN 来模拟同样的事情:

    -- 要更新的行 SELECT * FROM staging JOIN destination ON staging.ID = destination.ID

    -- 要插入的行 SELECT * FROM staging JOIN destination ON staging.ID = destination.ID WHERE destination.ID IS NULL

简单易懂,没有光标。

于 2011-11-16T14:22:59.463 回答