wake-up-neo.com

Spaltenname oder Anzahl der angegebenen Werte stimmt nicht mit der Tabellendefinition überein

In SQL Server versuche ich, mithilfe der folgenden Abfrage Werte aus einer Tabelle in eine andere einzufügen:

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

Ich erhalte folgende Fehlermeldung:

Der Spaltenname oder die Anzahl der angegebenen Werte stimmt nicht mit der Tabellendefinition überein.

Ich bin sicher, dass beide Tabellen dieselbe Struktur, dieselben Spaltennamen und denselben Datentyp haben.

Bitte helfen

34
Jaison

Sie haben nicht die gleiche Struktur ... Ich kann garantieren, dass sie unterschiedlich sind

Ich weiß, dass Sie es bereits erstellt haben ... In der Datenbank befindet sich bereits ein Objekt mit dem Namen "tbltable1"

Möglicherweise möchten Sie Folgendes (wodurch auch Ihr anderes Problem behoben wird):

Drop table tblTable1

select * into tblTable1 from tblTable1_Link
39
gbn

bei Einfügungen ist es immer besser, die Spaltennamen anzugeben, siehe folgende

DECLARE @Table TABLE(
        Val1 VARCHAR(MAX)
)

INSERT INTO @Table SELECT '1'

funktioniert gut, das Ändern der Tabelle def in verursacht den Fehler 

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

INSERT INTO @Table SELECT '1'

Meldung 213, Ebene 16, Status 1, Zeile 6 Fehler beim Einfügen: Spaltenname oder Nummer von Die angegebenen Werte entsprechen nicht der Tabelle Definition.

Aber ändern Sie das oben auf 

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

INSERT INTO @Table (Val1)  SELECT '1'

funktioniert. Sie müssen mit den angegebenen Spalten genauer sein

liefern die Strukturen und wir können einen Blick darauf werfen

18
Adriaan Stander

Dies ist ein älterer Beitrag, aber ich möchte das auch erwähnen, wenn Sie so etwas haben

insert into blah
       select * from blah2

und bla und blah2 sind identisch. Denken Sie daran, dass eine berechnete Spalte denselben Fehler auslöst ...

Mir wurde gerade klar, dass das gescheitert war und ich versuchte es

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

In meinem Beispiel war es das Feld Vollname (berechnet aus dem ersten und letzten Feld usw.).

14
Kris Benedict

Das Problem ist, dass Sie versuchen, Daten in die Datenbank einzufügen, ohne Spalten zu verwenden. Der SQL Server gibt diese Fehlermeldung aus.

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

wenn Sie 4 Spalten haben, aber nur 3 davon einfügen möchten

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

hoffe das hilft

9
CodeCoder

Das Ablegen des Tisches war für mich keine Option, da ich ein laufendes Protokoll führe. Wenn jedes Mal, wenn ich Einfügen musste, ich ablegen musste, wäre der Tisch bedeutungslos.

Mein Fehler war, dass ich in der create table-Anweisung ein paar Spalten hatte, die Produkte anderer Spalten waren. Das Ändern dieses Problems hat mein Problem behoben. z.B

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
2
ScottieB

Für mich ist der Täter der Wert des Gehalts

Fügen Sie die Werte für Mitarbeiter (ID, Vorname, Nachname, Geschlecht, Gehalt) (3, 'Kanada', 'pa', 'm', 15.000) ein.

in Gehaltsspalte Wenn wir 15.000 zuweisen, verstehen der Compiler 15 und 000.

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

0
Kris Sam

Überprüfen Sie, ob Ihre ID die ID ist. Wenn dies der Fall ist, stellen Sie sicher, dass ID nicht NULL ist. Identity (1,1) Bevor Sie Ihre Tabelle erstellen, löschen Sie die Tabelle und erstellen dann die Tabelle .. Nach 2 Tagen habe ich meine dieses Problem.. 

0

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

dies beinhaltet das Erstellen eines Verbindungsservers und die Verwendung von dynamischem SQL - nicht das Beste, aber wenn jemand etwas Besseres vorschlagen kann, kommentieren Sie bitte die 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

dies funktioniert jetzt für mich ... Ich kann garantieren, dass die Anzahl der Spalten und der Typ der von der gespeicherten Prozedur zurückgegebenen Spalten der in dieser Tabelle angegebenen ist, einfach weil ich dieselbe Tabelle aus der gespeicherten Prozedur zurückschicke.

danke und grüße marcelo

0

Die berechneten Spalten machen das Problem. Verwenden Sie nicht SELECT *. Sie müssen alle Felder mit Ausnahme von berechneten Feldern nach SELECT angeben 

0
GyurcIT

Hüten Sie sich vor Auslösern. Möglicherweise liegt das Problem mit einer Operation im Auslöser für eingefügte Zeilen.

0
linitux

das Spaltenpräfix stimmt nicht mit einem Tabellennamen oder Aliasnamen überein, der in der Abfrage verwendet wird.

Ich arbeitete auch daran, diesen Fehler zu beheben

Nw ich fand heraus, warum es gerade kommt, muss nur kleine Änderungen in der Abfrage vornehmen

http://sqlerrormessages.blogspot.com/2009/08/sql-server-error-messages-msg-107.html

0
Sumasn

Update auf SQL Server 2016/2017 /…
Wir haben einige gespeicherte Prozeduren zum Importieren und Exportieren von Datenbanken.
Im sp verwenden wir (unter anderem) RESTORE FILELISTONLY FROM DISK, wo wir eine Tabelle "#restoretemp" für die Wiederherstellung aus Datei erstellen. 

Mit SQL Server 2016 hat MS ein Feld SnapshotURL nvarchar (360) (Wiederherstellungs-URL Azure) hinzugefügt, was die Fehlermeldung verursacht hat.
Nachdem ich das zusätzliche Feld erweitert habe, hat die Wiederherstellung wieder funktioniert.
Code abgeschnitten (siehe letztes Feld):

 SET @query = 'RESTORE FILELISTONLY FROM DISK = ' + QUOTENAME(@BackupFile , '''')
CREATE TABLE #restoretemp
(
LogicalName nvarchar(128)
,PhysicalName nvarchar(128)
,[Type] char(1)
,FileGroupName nvarchar(128)
,[Size] numeric(20,0)
,[MaxSize] numeric(20,0)
,FileID bigint
,CreateLSN numeric(25,0)
,DropLSN numeric(25,0) NULL
,UniqueID uniqueidentifier
,ReadOnlyLSN numeric(25,0)
,ReadWriteLSN numeric(25,0)
,BackupSizeInByte bigint
,SourceBlockSize int
,FilegroupID int
,LogGroupGUID uniqueidentifier NULL
,DifferentialBaseLSN numeric(25,0)
,DifferentialbaseGUID uniqueidentifier
,IsReadOnly bit
,IsPresent bit
,TDEThumbprint varbinary(32)
-- Added field 01.10.2018 needed from SQL Server 2016 (Azure URL)
,SnapshotURL nvarchar(360)
)

INSERT #restoretemp EXEC (@query)
SET @errorstat = @@ERROR
if @errorstat <> 0 
Begin
if @Rueckgabe = 0 SET @Rueckgabe = 6
End
Print @Rueckgabe
0
FredyWenger