Foutbericht 213 is een veelvoorkomende fout die optreedt wanneer u waarden in een tabel probeert in te voegen zonder de kolomnamen expliciet op te geven.
De fout ziet er als volgt uit:
Msg 213, Level 16, State 1, Line 1 Column name or number of supplied values does not match table definition.
Het treedt op wanneer u het verkeerde aantal waarden voor die tabel opgeeft. Met andere woorden, het aantal waarden dat u opgeeft, komt niet overeen met het aantal kolommen in de tabel.
Voorbeeld
Hier is een voorbeeld om te demonstreren.
INSERT INTO Customers
VALUES ('Jake');
Resultaat:
Msg 213, Level 16, State 1, Line 1 Column name or number of supplied values does not match table definition.
In mijn geval is het probleem dat de tabel eigenlijk drie kolommen bevat. Mijn tabeldefinitie ziet er als volgt uit:
CREATE TABLE Customers (
CustomerId int IDENTITY(1,1) NOT NULL,
FirstName nvarchar(255),
LastName nvarchar(255)
);
Ik probeer een waarde in te voegen, maar SQL Server weet niet in welke kolom het moet komen, vandaar de fout.
Ik zou ook dezelfde foutmelding krijgen als ik probeerde te veel waarden in te voegen. Het volgende geeft bijvoorbeeld ook dezelfde fout.
INSERT INTO Customers
VALUES ('Jake', 'Smith', 'New York', 'USA');
Resultaat:
Msg 213, Level 16, State 1, Line 1 Column name or number of supplied values does not match table definition.
Hoe de fout op te lossen
Een manier om dit op te lossen, is ervoor te zorgen dat het aantal waarden dat u probeert in te voegen, daadwerkelijk overeenkomt met het aantal kolommen in de tabel.
Een betere manier om dit te doen, is door de kolomnamen expliciet op te geven in uw INSERT
uitspraak. Als u dit doet, zorgt u ervoor dat u niet per ongeluk gegevens in de verkeerde kolommen invoegt.
Dus afhankelijk van welke waarden ik wil invoegen, zou ik mijn voorbeeld hier naar kunnen herschrijven:
INSERT INTO Customers (FirstName)
VALUES ('Jake');
Of dit:
INSERT INTO Customers (FirstName, LastName)
VALUES ('Jake', 'Smith');
Impliciete kolomnamen
Zoals vermeld, is het beter om elke kolomnaam expliciet te spellen in uw INSERT
statement (zoals ik deed in het vorige voorbeeld).
Ik zou echter mijn voorbeeld kunnen wijzigen om impliciete kolomnamen te gebruiken, zoals deze:
INSERT INTO Customers
VALUES (1, 'Jake', 'Smith');
Dit kan nu echter een apart probleem veroorzaken met betrekking tot de identiteitskolom. Zie Een expliciete waarde invoegen in een identiteitskolom als dat nodig is.