2009-07-20 6 views
31

in SQL Server, sto cercando di inserire i valori da una tabella all'altra utilizzando la query di seguito:colonna o numero di valori forniti non corrisponde definizione della tabella

delete from tblTable1 

insert into tblTable1 select * from tblTable1_Link 

Sto ottenendo il seguente errore:

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

sono sicuro che sia tabella che ha stessa struttura, i nomi delle colonne e lo stesso tipo di dati:

Aiutateci!

+1

Un'altra possibilità è che la collazione DB sul tuo Il DB TEMP e il DB che si sta inserendo non corrispondono. –

risposta

14

per inserti è sempre meglio specificare i nomi delle colonne vedere il seguente

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX) 
) 

INSERT INTO @Table SELECT '1' 

funziona bene, cambiando il DEF tavolo per causa l'errore

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.

Ma cambiare quanto sopra per

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

INSERT INTO @Table (Val1) SELECT '1' 

opere. È necessario essere più specifici con le colonne specificate

fornire le strutture e possiamo avere uno sguardo

2

far cadere il tavolo non era un'opzione per me, dal momento che sto mantenendo un registro in esecuzione. Se ogni volta che dovevo inserire dovevo cadere, il tavolo sarebbe privo di significato.

Il mio errore è dovuto al fatto che ho avuto un paio di colonne nell'istruzione della tabella create che erano prodotti di altre colonne, cambiando questi risolto il mio problema. ad esempio

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

Questo è un messaggio vecchio ma voglio ricordare anche che se hai qualcosa di simile

insert into blah 
     select * from blah2 

e bla e blah2 sono tenere identici a mente che una colonna calcolata getterà questo stesso errore ...

Ho appena realizzato che quando il sopra fallito e ho cercato

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

Nel mio esempio è stato campo FullName (calcolato dal primo e l'ultimo, ecc)

1

Le colonne calcolate rendono il problema. Non utilizzare SELECT *. È necessario specificare ciascun campo dopo SELEZIONA eccetto i campi calcolati

0

Spero che tu abbia trovato una buona soluzione. Ho avuto lo stesso problema e il modo in cui ho lavorato non è probabilmente il migliore, ma funziona ora.

prevede la creazione di un server collegato e l'utilizzo di SQL dinamico, non il migliore, ma se qualcuno può suggerire qualcosa di meglio, si prega di commentare/rispondere.

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 

questo sta funzionando per me ora. Posso garantire che il numero di colonne e il tipo di colonne restituite dalla stored procedure siano gli stessi di questa tabella, semplicemente perché restituisco la stessa tabella dalla stored procedure.

grazie e saluti Marcelo

8

Il problema è che si sta cercando di inserire i dati nel database senza l'utilizzo di colonne. Il server SQL fornisce questo messaggio di errore.

errore: insert into users values('1', '2','3') - questo funziona bene finché si hanno solo 3 colonne

se si dispone di 4 colonne, ma solo da inserire in 3 di loro

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

Spero che questo aiuti

0

per me il colpevole è il valore assegnato a int stipendio

Inserire nel Emp loyees (, Nome, Cognome, genere, ID stipendio) valori (3, 'Canada', 'pa', 'm', 15.000)

nella colonna stipendio Quando abbiamo assegnare 15.000 il compilatore capire 15 e 000

Questa correzione funziona bene per me. Inserisci in Employees (ID, FirstName, LastName, Gender, Salary) valori (4, 'US', 'sam', 'm', 15000)

0

controllare l'ID è Identità, se è quindi assicurarsi c'è ID non null Identity (1,1) e prima di creare la tabella, Drop table e quindi creare tabella .. Dopo 2 giorni ho risolto il mio problema ..

Problemi correlati