2010-07-27 61 views
5

我打算从一个数据库转储一些数据到另一个。我正在使用tsql身份插入没有列名列表

set identity_insert MyTable on 
GO 
INSERT INTO MyTable SELECT * FROM sourceDB.dbo.MyTable 
GO 
set identity_insert MyTable off 

无论如何要让这个工作?有30个表,并且将列名列表添加到插入语句会很费时。我正在使用SQL Server 2000.近期将升级到SQL Server 2008。编辑: MyTable有一个标识列。

+0

什么不工作?什么是错误? – 2010-07-27 15:06:00

+0

仅当使用列列表且IDENTITY_INSERT为ON时,才能指定表'MyTable'中标识列的显式值。 – David 2010-07-27 15:13:43

+0

但是,如果我将insert语句更改为INSERT INTO MyTable(Col1,Col2,...,LastColumn)SELECT * FROM sourceDB.dbo.MyTable。 然后它的作品O_O – David 2010-07-27 15:14:26

回答

4

只需从对象浏览器中拖放列名即可。你可以做到这一步,它比编写select *要花费大约1秒的时间,而且你不应该在生产代码中使用select *。这是一个不好的做法。

虽然我很担心你插入标识列,但这是几乎从未做过的事情。如果原始表的某些标识列与新表中的退出标识相同,该怎么办?在决定从另一个表中插入id值之前,请确保检查了这一点。我更喜欢对父表执行插入操作并获取一个新的ID并将其与旧的ID匹配(2008年的输出对此很有帮助),然后将新的ID用于任何子表,但加入旧的ID。

+0

谢谢。我将30个表复制到dev服务器以测试某些内容。 – David 2010-07-28 14:00:31

3

刚刚在SQL Server 2000 SP2计算机上尝试过这种情况时,收到此错误,并且似乎证实了您的观察结果。

仅当使用列列表且IDENTITY_INSERT为ON时,才能指定表'Foo2'中标识列的显式值。

set identity_insert Foo2 on 
GO 
INSERT INTO Foo2 select top 100 * from Foo where id > 110000 
GO 
set identity_insert Foo2 off 

SELECT INTO建议将不仅有助于使数据进入一个临时表。在某些时候,你必须明确说明列名。

对列名称的提示:在SSMS查询中突出显示该表,并按下Alt-F1(快捷键sp_help)。然后,您可以将生成的column_name复制/粘贴到您的查询中,只需手动添加逗号即可。将快捷方式更进一步,并将其粘贴到Excel中,键入一个逗号,然后复制列。

+0

+1。尴尬。 2005年没有碰到困难。 – Tobiasopdenbrouw 2010-07-27 15:23:35

+0

@Tobiasopdenbrouw我在sql server 2005上得到了同样的错误。 – David 2010-07-27 15:29:43

0

如果你并不需要保存ID列的值,您可以:

删除ID列

做一个ID列在您的新模式,在新的目标DB(使它列列表中的最后一列)

INSERT INTO newdb.dbo.newtable 
SELECT * FROM olddb.dbo.oldtable 

它将在生成新的ID信息时保留其余列。