Kolomnaam of aantal opgegeven waarden komt niet overeen met tabeldefinitie

In SQL-server probeer ik waarden van de ene tabel naar de andere in te voegen met behulp van de onderstaande query:

delete from tblTable1
insert into tblTable1 select * from tblTable1_Link

Ik krijg de volgende foutmelding:

Kolomnaam of aantal opgegeven waarden komt niet overeen met tabeldefinitie.

Ik weet zeker dat beide tabellen dezelfde structuur, dezelfde kolomnamen en dezelfde gegevenstypen hebben.

Help alstublieft!


Antwoord 1, autoriteit 100%

Ze hebben niet dezelfde structuur… Ik kan garanderen dat ze verschillend zijn

Ik weet dat je het al hebt gemaakt… Er is al een object met de naam ‘tbltable1’ in de database

Wat je misschien wilt is dit (wat ook je andere probleem oplost):

Drop table tblTable1
select * into tblTable1 from tblTable1_Link

Antwoord 2, autoriteit 51%

Dit is een ouder bericht, maar ik wil ook vermelden dat als je zoiets hebt als

insert into blah
       select * from blah2

en blah en blah2 zijn identiek, houd er rekening mee dat een berekende kolom dezelfde fout zal veroorzaken…

Ik realiseerde me net dat toen het bovenstaande faalde en ik het probeerde

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

In mijn voorbeeld was het een veld met volledige naam (berekend vanaf de eerste en laatste, enz.)


Antwoord 3, autoriteit 43%

voor invoegingen is het altijd beter om de kolomnamen te specificeren, zie het volgende

DECLARE @Table TABLE(
        Val1 VARCHAR(MAX)
)
INSERT INTO @Table SELECT '1'

werkt prima, het veranderen van de tabeldef naar veroorzaakt de fout

DECLARE @Table TABLE(
        Val1 VARCHAR(MAX),
        Val2 VARCHAR(MAX)
)
INSERT INTO @Table SELECT '1'

Bericht 213, niveau 16, staat 1, regel 6
Insert Error: Kolomnaam of nummer van
opgegeven waarden komen niet overeen met tabel
definitie.

Maar het bovenstaande veranderen in

DECLARE @Table TABLE(
        Val1 VARCHAR(MAX),
        Val2 VARCHAR(MAX)
)
INSERT INTO @Table (Val1)  SELECT '1'

werkt. U moet specifieker zijn met de opgegeven kolommen

lever de structuren en we kunnen een kijkje nemen


Antwoord 4, autoriteit 18%

Het probleem is dat u gegevens in de database probeert in te voegen zonder kolommen te gebruiken. Sql-server geeft je die foutmelding.

fout: insert into users values('1', '2','3')– dit werkt prima zolang je maar 3 kolommen hebt

als u 4 kolommen heeft, maar er slechts in 3 wilt invoegen

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

hoop dat dit helpt


Antwoord 5, autoriteit 4%

De tafel laten vallen was voor mij geen optie, aangezien ik een lopend logboek bijhoud. Als ik elke keer dat ik moest invoegen ik moest laten vallen, zou de tabel zinloos zijn.

Mijn fout was omdat ik een paar kolommen in de create table-instructie had die producten waren van andere kolommen, waardoor mijn probleem werd verholpen door deze te wijzigen. bijv.

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

Antwoord 6, autoriteit 4%

Pas op voor triggers. Misschien zit het probleem in een bewerking in de trigger voor ingevoegde rijen.


Antwoord 7, autoriteit 2%

De berekende kolommen maken het probleem.
Gebruik SELECT *niet. U moet elk veld opgeven na SELECT, behalve berekende velden


Antwoord 8

Ik hoop dat je een goede oplossing hebt gevonden.
Ik had hetzelfde probleem, en de manier waarop ik er omheen werkte is waarschijnlijk niet de beste, maar het werkt nu.

het gaat om het maken van een gekoppelde server en het gebruik van dynamische sql – niet de beste, maar als iemand iets beters kan voorstellen, geef dan commentaar/antwoord.

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

dit werkt nu voor mij.
Ik kan garanderen dat het aantal kolommen en het type kolommen dat wordt geretourneerd door de opgeslagen procedure hetzelfde is als in deze tabel, simpelweg omdat ik dezelfde tabel terugstuur vanuit de opgeslagen procedure.

bedankt en groeten
marcelo


Antwoord 9

Voor mij is de boosdoener de waarde die wordt toegekend aan het salaris

Invoegen in werknemers (ID,Voornaam,Achternaam,Geslacht,Salaris) waarden (3,’Canada’, ‘pa’, ‘m’,15,000)

in salariskolom Wanneer we 15.000 toewijzen, begrijpt de samensteller 15 en 000.

Deze correctie werkt prima voor mij.
Invoegen in Werknemers(ID,Voornaam,Achternaam,Geslacht,Salaris) waarden(4,’US’, ‘sam’, ‘m’,15000)


Antwoord 10

Update naar SQL server 2016/2017/…
We hebben een aantal opgeslagen procedures om databases te importeren en exporteren.
In de sp gebruiken we (onder andere) RESTORE FILELISTONLY VAN DISK waar we een
tabel “#restoretemp” voor het herstellen van een bestand.

Met SQL server 2016 heeft MS een veld toegevoegd SnapshotURL nvarchar(360)(restore url Azure) wat de foutmelding heeft veroorzaakt.
Nadat ik het extra veld heb verbeterd, is het terugzetten weer gelukt.
Code geknipt (zie laatste veld):

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

Antwoord 11

Controleer uw id. Is het identiteit? Als dit het geval is, zorg er dan voor dat het wordt gedeclareerd als ID not null Identity(1,1)

En voordat u uw tabel maakt, Drop tableen create table.


Antwoord 12

Het probleem dat ik had dat deze fout veroorzaakte, was dat ik null-waarden probeerde in te voegen in een NOT NULL-kolom.


Antwoord 13

Sommige bronnen voor deze problemen zijn zoals hieronder

1- Identiteitskolom ,

2- Berekende kolom

3- verschillende structuur

dus controleer die 3 , ik ontdekte dat mijn probleem het tweede was ,

Other episodes