从一个表到另一个表的批量插入全部在服务器上

sta*_*ius 5 sql database data-migration sql-server-2005

我必须将一堆数据从一个数据库表复制到另一个数据库表中。我无法使用 SELECT ... INTO 因为其中一列是标识列。另外,我还需要对架构进行一些更改。我能够使用导出数据向导创建一个 SSIS 包,然后在 Visual Studio 2005 中对其进行编辑以进行所需的更改等。它肯定比 INSERT INTO 更快,但对我来说,将数据下载到另一台计算机只是为了再次上传回来似乎很愚蠢。(假设我是正确的,这就是 SSIS 包正在做的事情)。是否有相当于 BULK INSERT 的功能,可以直接在服务器上运行,允许保留标识值并从表中提取数据?(据我所知,BULK INSERT只能从文件中提取数据)

\n\n

编辑:\n我确实了解 IDENTITY_INSERT,但由于涉及大量数据,INSERT INTO ... SELECT 有点慢。SSIS/BULK INSERT 将数据转储到表中,而不考虑索引和日志记录等,因此速度更快。(当然,一旦填充表就在表上创建聚集索引并不快,但它仍然比我第一次尝试的 INSERT INTO...SELECT 更快)

\n\n

编辑 2:\n架构更改包括(但不限于)以下内容:\n1. 将一张表拆分为两张新表。将来每个表都会有自己的 IDENTITY 列,但对于迁移,我认为最简单的方法是使用原始表中的标识作为两个新表的标识。迁移完成后,其中一个表将与另一个表建立一对多关系。\n2. 将列从一个表移动到另一个表。\n3. 删除一些仅一对一交叉引用的交叉引用表。相反,引用将是两个表之一中的外键。\n4. 将使用默认值创建一些新列。\n5. 有些表\xe2\x80\x99根本没有改变,但由于“将其全部放入新的数据库”请求,我必须将它们复制过来。

\n

sta*_*ius 0

既然这么多人看了这个问题,我想我应该跟进一下。

我最终坚持使用 SSIS 包。我在数据库服务器本身上执行它。它仍然经历了将数据从 sql 进程提取到 SSIS 进程,然后将其发送回来的繁琐过程。但总的来说,它比我研究的其他选项执行得更快。

另外,我遇​​到了一个错误:当从视图中提取数据时,包会挂起。我最终将视图中的查询直接剪切并粘贴到 SSIS 中“源”对象的“sql 查询”字段中。这似乎只发生在包与服务器在同一台机器上运行时。当从不同的机器运行时,我没有遇到这个错误。

如果我必须重来一次,我可能会产生新的身份价值观。我会将旧表迁移到新表中的列,使用这些值关联其他表的外键,然后在迁移完成且稳定后删除该列。另一方面,总体而言,SSIS 包方法运行良好,因此如果您必须进行复杂的迁移(拆分表等)或需要保持身份值完整,我会推荐它。

感谢大家的回应。