2009-07-20 5 views
31

In SQL Server übereinstimmen, ich versuche, Wert zu einem anderen aus einer Tabelle einzufügen, indem Sie die folgenden Kriterien:Spaltenname oder Anzahl der übergebenen Werte nicht Tabellendefinition

delete from tblTable1 

insert into tblTable1 select * from tblTable1_Link 

ich die folgenden Störung erhalten:

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

ich bin sicher, dass beide Tabelle gleiche Struktur, Spaltennamen und denselben Datentyp:

Bitte um Hilfe!

+1

Eine weitere Möglichkeit ist, dass die DB-Kollatierung auf Ihrem TEMP DB und der DB, in den Sie einfügen, stimmen nicht überein. –

Antwort

14

für Einsätze es immer besser ist, die Spaltennamen sehen angeben folgende

DECLARE @Table TABLE(
     Val1 VARCHAR(MAX) 
) 

INSERT INTO @Table SELECT '1' 

funktioniert gut, die Tabelle def Wechsel zu bewirkt, dass der Fehler

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.

Aber die Änderung der oben

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

INSERT INTO @Table (Val1) SELECT '1' 

funktioniert. Sie müssen konkreter werden mit den Spalten

liefern die Strukturen festgelegt und wir einen Blick

2

Dropping die Tabelle für mich keine Option machen war, weil ich ein laufendes Protokoll führe. Wenn ich jedes Mal, wenn ich einfügen musste, fallen musste, wäre der Tisch bedeutungslos.

Mein Fehler war, weil ich ein paar Spalten in der create-Tabelle-Anweisung hatte, die Produkte anderer Spalten waren, änderte diese mein Problem behoben. zB

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

Dies ist ein älteres Post, aber ich möchte auch erwähnen, dass, wenn Sie so etwas wie

insert into blah 
     select * from blah2 

und bla und blah2 sind identisch keep im Sinn haben, dass eine berechnete Spalte diesen gleichen Fehler werfen ...

Ich habe erkannt, dass, wenn die oben gescheitert und ich versuchte

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

In meinem Beispiel war es Fullname-Feld (berechnet aus der ersten und letzten, usw.)

1

Die berechneten Spalten, das Problem zu machen. Verwenden Sie nicht SELECT *. Sie müssen jedes Feld nach SELECT angeben außer den berechneten Feldern

0

Ich hoffe, Sie haben eine gute Lösung gefunden. Ich hatte das gleiche Problem, und die Art und Weise, wie ich daran arbeitete, ist wahrscheinlich nicht die beste, aber es funktioniert jetzt.

es beinhaltet die Schaffung eines Verbindungsservers und die Verwendung von dynamischen SQL - nicht die beste, aber wenn jemand etwas besser vorschlagen kann, bitte Kommentar/Antwort.

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 

das funktioniert jetzt für mich. Ich kann garantieren, dass die Anzahl der Spalten und die Art der Spalten, die von der gespeicherten Prozedur zurückgegeben werden, dieselben sind wie in dieser Tabelle, weil ich die gleiche Tabelle aus der gespeicherten Prozedur zurückgebe.

Danke und Grüße marcelo

8

Das Problem ist, dass Sie Daten in die Datenbank einfügen, ohne Spalten versuchen. Sql-Server gibt Ihnen diese Fehlermeldung.

Fehler: insert into users values('1', '2','3') - das funktioniert gut, solange Sie nur 3 Spalten haben

wenn Sie 4 Spalten haben, wollen aber nur in 3 von ihnen

richtig einzufügen: insert into users (firstName,lastName,city) values ('Tom', 'Jones', 'Miami')

hoffe, das hilft

0

Für mich ist der Täter int Wert Gehalt zugewiesen

Insert in Emp loyees (ID, Vorname, Nachname, Geschlecht, Gehalt) Werte (3, 'Kanada', 'pa', 'm', 15,000)

in Spalte Gehalt Wenn wir 15.000 der Compiler 15 verstehen zuweisen und 000.

Diese Korrektur funktioniert gut für mich. Einfügen in Mitarbeiter (ID, Vorname, Nachname, Geschlecht, Gehalt) Werte (4, 'US', 'sam', 'm', 15000)

0

Überprüfen Sie Ihre ID ist es Identität, wenn es dann sicher ist Es gibt ID nicht null Identität (1,1) und vor dem Erstellen Ihrer Tabelle, Drop Tabelle und dann Tabelle erstellen .. Nach 2 Tagen löste ich dieses Problem ..

Verwandte Themen