sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server Error 213:Kolumnnamn eller antal angivna värden matchar inte tabelldefinitionen.

Felmeddelande 213 är ett vanligt fel som inträffar när du försöker infoga värden i en tabell utan att explicit ange kolumnnamnen.

Felet ser ut så här:

Msg 213, Level 16, State 1, Line 1
Column name or number of supplied values does not match table definition.

Det inträffar när du anger fel antal värden för den tabellen. Med andra ord, antalet värden du anger matchar inte antalet kolumner i tabellen.

Exempel

Här är ett exempel att visa.

INSERT INTO Customers
VALUES ('Jake');

Resultat:

Msg 213, Level 16, State 1, Line 1
Column name or number of supplied values does not match table definition.

I mitt fall är problemet att tabellen faktiskt innehåller tre kolumner. Min tabelldefinition ser ut så här:

CREATE TABLE Customers (
CustomerId int IDENTITY(1,1) NOT NULL,
FirstName nvarchar(255),
LastName nvarchar(255)
);

Jag försöker infoga ett värde, men SQL Server vet inte vilken kolumn den ska hamna i, därav felet.

Jag skulle också få samma felmeddelande om jag försökte infoga för många värden. Till exempel ger följande också samma fel.

INSERT INTO Customers
VALUES ('Jake', 'Smith', 'New York', 'USA');

Resultat:

Msg 213, Level 16, State 1, Line 1
Column name or number of supplied values does not match table definition.

Hur du åtgärdar felet

Ett sätt att fixa detta är att se till att antalet värden du försöker infoga faktiskt matchar antalet kolumner i tabellen.

Ett bättre sätt att göra det är att explicit specificera kolumnnamnen i din INSERT påstående. Om du gör detta säkerställer du att du inte av misstag infogar data i fel kolumner.

Så beroende på vilka värden jag vill infoga, skulle jag kunna skriva om mitt exempel till detta:

INSERT INTO Customers (FirstName)
VALUES ('Jake');

Eller det här:

INSERT INTO Customers (FirstName, LastName)
VALUES ('Jake', 'Smith');

Implicita kolumnnamn

Som nämnts är det bättre att uttryckligen stava varje kolumnnamn i din INSERT uttalande (som jag gjorde i föregående exempel).

Jag skulle dock kunna ändra mitt exempel till att använda implicita kolumnnamn, så här:

INSERT INTO Customers
VALUES (1, 'Jake', 'Smith');

Men detta kan nu orsaka en separat fråga angående identitetskolumnen. Se hur du infogar ett explicit värde i en identitetskolumn om du behöver göra detta.


  1. ORA-01264 i fysisk standby

  2. DOs och DONTs för index

  3. Trace Flag 2389 och den nya Cardinality Estimator

  4. Flytta SQL Server-databaser till molnet