69 Stimmen

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

In SQL Server versuche ich, Werte aus einer Tabelle in eine andere einzufügen, indem ich die folgende Abfrage verwende:

delete from tblTable1

insert into tblTable1 select * from tblTable1_Link

Ich erhalte den folgenden Fehler:

Spaltenname oder Anzahl der gelieferten Werte stimmt nicht mit der Tabellendefinition überein.

Ich bin sicher, dass beide Tabellen die gleiche Struktur, die gleichen Spaltennamen und die gleichen Datentypen haben.

2 Stimmen

Eine weitere Möglichkeit ist, dass die DB-Kollation Ihrer TEMP-DB und der DB, in die Sie einfügen, nicht übereinstimmen.

4 Stimmen

Ist dies nicht höchst anfechtbar, weil die Schemata der Tabellen nicht veröffentlicht wurden? "Ich bin mir sicher" reicht nicht aus: Wir alle waren schon oft genug in Situationen, in denen wir den Wald vor lauter Bäumen nicht sehen konnten, um zu wissen, dass unsere eigene Gewissheit bedauerlicherweise falsch sein kann, und es braucht eine angemessene Menge an Informationen über das Problem, damit jemand anderes uns auf das Offensichtliche hinweist, das wir übersehen haben.

1 Stimmen

Sie sollten auch einen Blick auf alle Auslöser werfen. Sie erhalten genau die gleiche Meldung, wenn Sie einen schlecht geschriebenen Trigger haben, der in etwas wie eine Prüfungstabelle einfügt.

2voto

ScottieB Punkte 3826

Den Tisch fallen zu lassen, kam für mich nicht in Frage, da ich ein laufendes Protokoll führe. Wenn ich jedes Mal, wenn ich etwas einfügen muss, die Tabelle löschen müsste, wäre sie sinnlos.

Mein Fehler lag darin, dass ich einige Spalten in der Tabellenanweisung "create table" hatte, die Produkte anderer Spalten waren; durch Ändern dieser Spalten wurde mein Problem behoben.

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

1voto

GyurcIT Punkte 19

Die berechneten Spalten sind das Problem. Verwenden Sie nicht SELECT * . Sie müssen jedes Feld nach SELECT angeben, mit Ausnahme von berechneten Feldern

1voto

Ali Punkte 854

Einige Quellen zu diesem Thema sind folgende

1- Identitätsspalte ,

2- Berechnete Spalte

3- unterschiedliche Struktur

so überprüfen Sie diese 3, ich fand mein Problem war die zweite,

0voto

Marcello Miorelli Punkte 2983

Ich hatte das gleiche Problem, und die Art und Weise, wie ich es umgangen habe, ist wahrscheinlich nicht die beste, aber es funktioniert jetzt.

Es beinhaltet die Erstellung eines verknüpften Servers und die Verwendung von Dynamic Sql - nicht das Beste, aber wenn jemand etwas Besseres vorschlagen kann, bitte kommentieren/antworten.

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 bei mir. Ich kann garantieren, dass die Anzahl der Spalten und der Typ der Spalten, die von der gespeicherten Prozedur zurückgegeben werden, die gleichen sind wie in dieser Tabelle, einfach weil ich dieselbe Tabelle von der gespeicherten Prozedur zurückgebe.

0voto

Kris Sam Punkte 1

Bei mir ist der Schuldige der int-Wert, der dem Gehalt zugewiesen wurde

Insert into Mitarbeiter(ID,Vorname,Nachname,Geschlecht,Gehalt) values(3,'Kanada', 'pa', 'm',15,000)

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

Diese Korrektur funktioniert bei mir gut. Insert into Mitarbeiter(ID,Vorname,Nachname,Geschlecht,Gehalt) values(4,'US', 'sam', 'm',15000)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X