2010-07-27 13 views
5

Voy a volcar algunos datos de un db a otro. Estoy usandoinserción de identidad tsql sin lista de nombres de columna

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

¿De todos modos hay que hacer que esto funcione? Hay 30 tablas y le llevará mucho tiempo agregar la lista de nombres de columna a la declaración de inserción. Estoy usando SQL Server 2000. Se actualizará a SQL Server 2008 en el futuro cercano.

EDIT: MyTable tiene una columna de identidad.

+0

¿Qué no funciona? ¿Cuál es el error? –

+0

Un valor explícito para la columna de identidad en la tabla 'MyTable' solo se puede especificar cuando se utiliza una lista de columnas y IDENTITY_INSERT está activado. – David

+0

Pero si cambio la instrucción de inserción a INSERT INTO MyTable (Col1, Col2, ..., LastColumn) SELECT * FROM sourceDB.dbo.MyTable. Entonces funciona O_O – David

Respuesta

4

Simplemente arrastre y suelte los nombres de las columnas desde el navegador de objetos. Puede hacerlo en un paso, demora aproximadamente 1 segundo más que escribir select * y nunca debe usar select * en el código de producción de todos modos. Es una práctica pobre.

Sin embargo, me preocupa que usted inserte columnas de Identidad, esto es algo que casi nunca debería hacerse. ¿Qué sucede si la tabla original tenía algunas columnas de identidad que son lo mismo que salir de los ID de la nueva tabla? Asegúrese de verificar esto antes de decidir insertar valores de identificación de otra tabla. Prefiero hacer la inserción en la tabla primaria y obtener una nueva identificación y hacerla coincidir con la identificación anterior (la salida es buena para esto en 2008) y luego usar la nueva identificación para cualquier tabla secundaria pero unirme a la anterior.

+0

Gracias. Estoy duplicando 30 tablas algo para un servidor de desarrollo para probar algo. – David

3

Después de haber intentado este escenario en una máquina SQL Server 2000 SP2, recibo este error y parece confirmar sus observaciones.

Un valor explícito para la columna de identidad en la tabla 'Foo2' solo se puede especificar cuando se utiliza una lista de columnas y IDENTITY_INSERT está activado.

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

La sugerencia SELECT INTO sólo ayudaría a obtener los datos en una tabla de ensayo. En algún momento, deberá indicar explícitamente los nombres de las columnas.

Indique los nombres de las columnas: Resalte la tabla en una consulta SSMS y pulse Alt-F1 (atajo para sp_help). A continuación, puede copiar/pegar el resultado column_name en su consulta y simplemente agregar las comas a mano. Avance los accesos directos un paso más y péguelos en Excel, escriba una coma y copie las columnas.

+0

+1. Torpe. 2005 lo hizo sin problemas. – Tobiasopdenbrouw

+0

@Tobiasopdenbrouw Recibí el mismo error en el servidor sql 2005. – David

0

Si no es necesario para preservar los valores de la columna ID, puede:

Caída de la columna ID

Realiza una columna de ID en su nuevo esquema en el nuevo objetivo DB (hacerlo la última columna en la lista de columnas)

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

Y conservará el resto de sus columnas al generar nueva información de ID.

Cuestiones relacionadas