2009-08-12 19 views
7

quiero insertar todo el registro de la copia de seguridad foo_bk tabla en la tabla foo sin concretar las columnas.SQL: Inserte todos los registros de una tabla a otra tabla sin concretar las columnas

si intento esta consulta

INSERT INTO foo 
SELECT * 
FROM foo_bk 

voy a conseguir de error "Error de inserción: Nombre de columna o número de valores proporcionados no coincide con la definición de tabla".

¿Es posible hacer inserción masiva de una mesa a otra sin suministro el nombre de columna? Lo he buscado en google pero parece que no puedo encontrar una respuesta. todas las respuestas requieren columnas específicas.

Respuesta

2

Es necesario tener al menos el mismo número de columnas y cada columna es a determinar exactamente de la misma manera, es decir, una columna varchar no se puede insertar en una columna int.

Para la transferencia masiva, consulte la documentación de la implementación SQL que está utilizando. A menudo hay herramientas disponibles para transferir datos a granel de una tabla a otra. Para SqlServer 2005, por ejemplo, puede usar el Asistente de importación y exportación de SQL Server. Haga clic con el botón derecho en la base de datos en la que intenta mover los datos y haga clic en Exportar para acceder a ella.

1

SQL 2008 le permite renunciar a la especificación de nombres de columna en su SELECT si utiliza SELECT INTO en lugar de INSERT INTO/SELECT:

SELECT * 
INTO Foo 
FROM Bar 
WHERE x=y 

La cláusula INTO existe en SQL Server 2000 a 2005, pero aún requiere especificando nombres de columnas. 2008 parece agregar la capacidad de usar SELECT *. Para obtener más información, consulte los artículos de MSDN en INTO (SQL2005), (SQL2008).

La cláusula INTO solo funciona si la tabla de destino aún no existe. Si está buscando agregar registros a una tabla existente, esto no ayudará.

+1

Esto sólo funciona en una tabla nueva. – JeffO

+1

INTO no funciona si la tabla ya existe. – HLGEM

+0

Y sí, puede seleccionar * en Sql Server 2000 – HLGEM

16

Nunca deberías querer hacer esto. Seleccione * no se debe utilizar como base para una inserción, ya que las columnas pueden moverse y romper su inserción (o peor aún, no romper la inserción, sino desordenar sus datos. Supongamos que alguien agrega una columna a la tabla en la selección, pero no en otra tabla, su código se romperá. O suponga que alguien, por razones que sobrepasan la comprensión pero que ocurre con frecuencia, decide hacer una caída y volver a crear en una tabla y mover las columnas a un orden diferente. Ahora su apellido es el lugar donde estaba first_name en origen y seleccione * lo colocará en la columna incorrecta en la otra tabla. Es una práctica extremadamente pobre no especificar las columnas y la asignación específica de una columna a la columna que desea en la tabla que le interesa.

En este momento puede tener varios problemas, primero las dos estructuras no coinciden directamente o en segundo lugar la tabla que se inserta tiene una identidad co lumn y así, aunque las columnas insertables son una coincidencia directa, la tabla que se inserta tiene una columna más que la otra y al no especificar la base de datos supone que va a intentar insertar en esa columna. O puede tener el mismo número de columnas, pero una es una identidad y, por lo tanto, no se puede insertar (aunque creo que sería un mensaje de error diferente).

10

por este otro mensaje: Insert all values of a..., puede hacer lo siguiente:

INSERT INTO new_table (Foo, Bar, Fizz, Buzz) 
SELECT Foo, Bar, Fizz, Buzz 
FROM initial_table 

Es importante especificar los nombres de columna como se indica por las otras respuestas.

0

Como probablemente haya entendido por las respuestas anteriores, no puede hacer lo que está buscando. Creo que puede comprender el problema que está experimentando SQL Server sin saber cómo asignar las columnas adicionales/faltantes.

Dicho esto, dado que usted menciona que el propósito de lo que intenta hacer aquí es una copia de seguridad, tal vez podamos trabajar con SQL Server y solucionar el problema. Sin saber su situación exacta hace que sea imposible golpeado con una respuesta correcta, pero asume lo siguiente:

  • que desea administrar un proceso de copia de seguridad/auditoría para una mesa.
  • Probablemente tenga algunas de ellas y desee evitar la modificación de objetos dependientes en cada adición/eliminación de columna.
  • La tabla de respaldo puede contener columnas adicionales para auditar.

deseo sugerir dos opciones para usted:

El práctica eficiente (OMI) de esto se puede detectar cambios en el esquema usando disparadores DDL y utilizarlos para modificar la tabla de copia de seguridad en consecuencia. Esto le permitirá usar el enfoque 'select * from ...', porque la lista de columnas será consistente entre las dos tablas.

He utilizado este enfoque con éxito y puede aprovecharlo para que los desencadenadores DDL administren automáticamente sus tablas de auditoría. En mi caso, utilicé una convención de nomenclatura para una tabla que requería auditorías y el activador DDL simplemente lo administró sobre la marcha.

Otra opción que puede ser útil para su escenario específico es crear una vista de apoyo para las tablas que alinean la lista de columnas. Aquí está un ejemplo rápido:

create table foo (id int, name varchar(50)) 
create table foo_bk (id int, name varchar(50), tagid int) 
go 

create view vw_foo as select id,name from foo 
go 

create view vw_foo_bk as select id,name from foo_bk 
go 

insert into vw_foo 
    select * from vw_foo_bk 
go 

drop view vw_foo 
drop view vw_foo_bk 
drop table foo 
drop table foo_bk 
go 

Espero que esto ayude :)

9

Utilice esta

SELECT * 
INTO new_table_name 
FROM current_table_name 
+3

Desea tener en cuenta que esto solo funcionará al crear una nueva tabla. ES DECIR. funciona como una copia de seguridad. Eso podría parecer obvio a partir de la declaración, pero quería reiterarlo. ¡Y gracias! Fue útil :) – Shrout1

+0

no necesita crear en esta consulta, esto junto con insert también crea la nueva tabla xameeramir

Cuestiones relacionadas