4

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

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

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

4

4 回答 4

3

我想你可能对身份插入感兴趣

于 2009-07-29T00:09:20.953 回答
2

我认为 SELECT...INTO 应该与 IDENTITY 列一起使用。您可能需要重新定义主键:

SELECT * INTO NewTable FROM OldTable
GO
ALTER TABLE NewTable ADD PRIMARY KEY(ColumnName)

如果这不起作用,您可以为旧表生成 CREATE TABLE 脚本,更改名称以创建新表,然后使用IDENTITY_INSERT允许使用 INSERT INTO NewTable SELECT FROM 从第一个表复制主键数据旧表。然后您可以在 SQL 中对服务器进行其他操作。

一个不错的好处是您可以在本地或在测试服务器上测试此脚本,并且可以在需要时重复它,只需重新运行脚本即可。

您的架构更改是否过于复杂而无法通过脚本进行更改?

于 2009-07-29T00:07:50.440 回答
1

请检查这个,

Select * Into NewTable
From OldTable
Where 1=2

Alter Table NewTable
Add id_col int indentity(1,1)

insert into NewTable(col1,col2,..... ) 
/* do not use id_col */
select col1,col2,..... from OldTable
于 2010-04-05T06:26:04.480 回答
0

既然很多人都看过这个问题,我想我应该跟进。

我最终坚持使用 SSIS 包。我在数据库服务器本身上执行了它。它仍然经历了将数据从 sql 进程拉到 SSIS 进程,然后将其发回的复杂过程。但总体而言,它比我调查的其他选项执行得更快。

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

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

感谢大家的回应。

于 2010-04-21T17:25:21.903 回答