2009-07-20 26 views
31

En el servidor SQL, estoy tratando de insertar valores de una tabla a otra mediante el uso de la consulta a continuación:columna o número de valores proporcionados no coincide con la definición de tabla

delete from tblTable1 

insert into tblTable1 select * from tblTable1_Link 

estoy consiguiendo el error siguiente:

Column name or number of supplied values does not match table definition. 

estoy seguro de que tanto la mesa de tener una misma estructura, los nombres de columna y el mismo tipo de datos:

por favor ayuda!

+1

Una posibilidad más es que la intercalación de DB en su TEMP DB y la base de datos en la que está insertando no coinciden. –

Respuesta

14

para las inserciones siempre es mejor para especificar los nombres de las columnas ver la siguiente

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX) 
) 

INSERT INTO @Table SELECT '1' 

funciona bien, el cambio de la definición de la tabla hace que el error

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX), 
     Val2 VARCHAR(MAX) 
) 

INSERT INTO @Table SELECT '1' 

Msg 213, Level 16, State 1, Line 6 Insert Error: Column name or number of supplied values does not match table definition.

Pero el cambio de la anterior para

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX), 
     Val2 VARCHAR(MAX) 
) 

INSERT INTO @Table (Val1) SELECT '1' 

obras. Es necesario ser más específico con las columnas especificadas

suministrar las estructuras y que puede tener una mirada

2

descartar la tabla no era una opción para mí, ya que estoy manteniendo un registro en funcionamiento. Si cada vez que necesitaba insertar tenía que soltar, la mesa no tendría sentido.

Mi error se debió a que tenía un par de columnas en la declaración create table que eran productos de otras columnas, cambiando estas solucionó mi problema. por ejemplo

create table foo (
field1 as int 
,field2 as int 
,field12 as field1 + field2) 

create table copyOfFoo (
field1 as int 
,field2 as int 
,field12 as field1 + field2) --this is the problem, should just be 'as int' 

insert into copyOfFoo 
SELECT * FROM foo 
10

Este es un mensaje más antiguo, pero Quiero también mencionar que si usted tiene algo así como

insert into blah 
     select * from blah2 

y bla y blah2 se mantiene idéntica en cuenta que una columna calculada lanzará este mismo error ...

me he dado cuenta de que cuando el anterior fallado y he intentado

insert into blah (cola, colb, colc) 
     select cola, colb, colc from blah2 

En mi ejemplo era el campo nombre completo (calculada a partir de la primera y la última, etc)

1

Las columnas calculadas hacen el problema. No use SELECT *. Debe especificar cada campo después de SELECT excepto los campos calculados

0

Espero que haya encontrado una buena solución. Tuve el mismo problema, y ​​la forma en que trabajé probablemente no sea la mejor, pero está funcionando ahora.

implica la creación de un servidor vinculado y el uso de sql dinámico, no el mejor, pero si alguien puede sugerir algo mejor, comente/responda.

declare @sql nvarchar(max) 


DECLARE @DB_SPACE TABLE (
[DatabaseName] NVARCHAR(128) NOT NULL, 
[FILEID] [smallint] NOT NULL, 
[FILE_SIZE_MB] INT NOT NULL DEFAULT (0), 
[SPACE_USED_MB] INT NULL DEFAULT (0), 
[FREE_SPACE_MB] INT NULL DEFAULT (0), 
[LOGICALNAME] SYSNAME NOT NULL, 
[DRIVE] NCHAR(1) NOT NULL, 
[FILENAME] NVARCHAR(260) NOT NULL, 
[FILE_TYPE] NVARCHAR(260) NOT NULL, 
[THE_AUTOGROWTH_IN_KB] INT NOT NULL DEFAULT(0) 
,filegroup VARCHAR(128) 
,maxsize VARCHAR(25) 

PRIMARY KEY CLUSTERED ([DatabaseName] ,[FILEID]) 
) 


SELECT @SQL ='SELECT [DatabaseName], 
     [FILEID], 
     [FILE_SIZE_MB], 
     [SPACE_USED_MB], 
     [FREE_SPACE_MB], 
     [LOGICALNAME], 
     [DRIVE], 
     [FILENAME], 
     [FILE_TYPE], 
     [THE_AUTOGROWTH_IN_KB] 
     ,filegroup 
     ,maxsize FROM OPENQUERY('+ QUOTENAME('THE_MONITOR') + ','''+ ' EXEC MASTER.DBO.monitoring_database_details ' +''')' 
exec sp_executesql @sql 


     INSERT INTO @DB_SPACE(
          [DatabaseName], 
          [FILEID], 
          [FILE_SIZE_MB], 
          [SPACE_USED_MB], 
          [FREE_SPACE_MB], 
          [LOGICALNAME], 
          [DRIVE], 
          [FILENAME], 
          [FILE_TYPE], 
          THE_AUTOGROWTH_IN_KB, 
          [filegroup], 
          maxsize 
         ) 

     EXEC SP_EXECUTESQL @SQL 

esto está trabajando para mí ahora. Puedo garantizar que el número de columnas y el tipo de columnas devueltas por el procedimiento almacenado son los mismos que en esta tabla, simplemente porque devuelvo la misma tabla del procedimiento almacenado.

gracias y saludos Marcelo

8

El problema es que usted está tratando de insertar datos en la base de datos sin necesidad de utilizar columnas. El servidor Sql le da ese mensaje de error.

error: insert into users values('1', '2','3') - esto funciona bien siempre y sólo tiene 3 columnas

si tiene 4 columnas, pero sólo desea insertar en 3 de ellos

correcta: insert into users (firstName,lastName,city) values ('Tom', 'Jones', 'Miami')

espero que esto ayude

0

para mí es el culpable int valor asignado al sueldo

Insertar en Emp (, ID, Nombre, Apellido, Género de sueldos) valores loyees (3, 'Canadá', 'pa', 'm', 15000)

en la columna de salario cuando asignamos 15.000 el compilador entiende 15 y 000.

Esta corrección funciona bien para mí. Insertar en empleados (ID, Nombre, Apellido, Sexo, Salario) valores (4, 'US', 'sam', 'm', 15000)

0

revise su identificación ¿Identidad, si es entonces asegúrese de hay ID no nulo Identity (1,1) y antes de crear su tabla, Drop table y luego crear la tabla ... Después de 2 días resolví mi problema ...

Cuestiones relacionadas