Sql server SQL Server数据导入

Sql server SQL Server数据导入,sql-server,cursor,bulkinsert,data-import,Sql Server,Cursor,Bulkinsert,Data Import,我们正在设计从外部源(如MAS200)到生产SQL Server 2005/2008数据库的数据导入。源将是一个事务数据库,并且是安全的/隔离的。我们需要保持数据库与源同步,以便定期进行数据同步 我们可以自由请求任何类型的源数据,比如CSV、txt文件,甚至可以将源数据放在另一个具有类似结构的SQL数据库中。我们需要选择导入数据的最佳方式—它将是周期性的,并且可能会每小时或每天进行一次 根据我的经验,我相信将源数据放在SQL数据库中可能是最好的开始方式。这是我们到目前为止得出的粗略设计- 定期从

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

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

根据我的经验,我相信将源数据放在SQL数据库中可能是最好的开始方式。这是我们到目前为止得出的粗略设计-

定期从外部填充源数据库,而不是我们的部分 预处理:抛光源表数据,即修剪、查找-常规数据格式化和转换 Fetch:创建一个游标来循环记录。我们计划更新现有数据并插入新数据,因此我们将需要至少两个游标循环。 填充:将更新/插入游标循环中的记录 后处理:再次进行一些最后的润色和查找映射,即用id替换代码 检查:最后,对表运行一致性检查,以确保导入的数据的完整性 总而言之,我们将打破存储过程中的步骤,然后创建一个SQL作业,该作业将一个接一个地遵循这些步骤。我知道有很多方法可以做到这一点,SSIS、数据导入向导等等。。但我们需要保持它非常简单、易于移植、不那么依赖和灵活,以适应未来的变化

注意:数据将是巨大的-上次我们有一个类似的设置,它需要几分钟,大约20-25分钟来完成整个数据导入过程,所以我们安排了每小时的数据导入

多谢各位

更新1: 我知道使用MERGE命令似乎是最好的。但是如果我必须为SQLServer2005创建它?我相信它在2008年以后会起作用。 我找到了一个链接-


关于项目3和4的其他2005个想法?

< p>——如果使用SQL Server 2008,请考虑使用合并命令而不是游标和循环< /p> 如果可能,保留源数据库的未触及副本,然后如果数据处理中存在任何问题,您可以更轻松地查找原因。

您考虑过使用吗?听起来你的项目非常适合它


我最近参与了一个项目,该项目从各种数据源(包括数据库和文件)中提取数据,对其进行聚合和清理,然后将其推送到关系型SQLServer2008数据库中。这在SSIS中是非常直接的。

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

从用于整理数据的暂存表中提取数据。 如果无法在SQL 2008中使用MERGE命令,则可以使用连接模拟相同的情况:

-要更新的行 挑选* 从登台 在staging.ID=destination.ID上加入目标

-要插入的行 挑选* 从登台 在staging.ID=destination.ID上加入目标 其中destination.ID为NULL


轻松轻松,无需使用光标。

如果您的数据如您所说的那样庞大,请务必避免使用光标!那么,我的游标替代方案是什么呢?我的意思是,我必须循环记录以进行插入和更新。在这种情况下,如何使用批量插入?批量更新是不可能的,所以我必须循环!您可以迭代RBAR。游标速度慢,并在min时导致行锁定。如果您要迭代,然后将值转储到具有标识的临时表中,并执行WHILE@count Herman,MERGE命令将为您执行插入和更新。对不起,我应该在我的注释中添加:如果您要迭代