Le message d'erreur 213 est une erreur courante qui se produit lorsque vous essayez d'insérer des valeurs dans une table sans spécifier explicitement les noms de colonne.
L'erreur ressemble à ceci :
Msg 213, Level 16, State 1, Line 1 Column name or number of supplied values does not match table definition.
Cela se produit lorsque vous spécifiez le mauvais nombre de valeurs pour cette table. En d'autres termes, le nombre de valeurs que vous fournissez ne correspond pas au nombre de colonnes du tableau.
Exemple
Voici un exemple pour illustrer.
INSERT INTO Customers
VALUES ('Jake');
Résultat :
Msg 213, Level 16, State 1, Line 1 Column name or number of supplied values does not match table definition.
Dans mon cas, le problème est que le tableau contient en fait trois colonnes. Ma définition de table ressemble à ceci :
CREATE TABLE Customers (
CustomerId int IDENTITY(1,1) NOT NULL,
FirstName nvarchar(255),
LastName nvarchar(255)
);
J'essaie d'insérer une valeur, mais SQL Server ne sait pas dans quelle colonne elle doit aller, d'où l'erreur.
J'obtiendrais également la même erreur si j'essayais d'insérer trop de valeurs. Par exemple, ce qui suit produit également la même erreur.
INSERT INTO Customers
VALUES ('Jake', 'Smith', 'New York', 'USA');
Résultat :
Msg 213, Level 16, State 1, Line 1 Column name or number of supplied values does not match table definition.
Comment corriger l'erreur
Une façon de résoudre ce problème consiste à s'assurer que le nombre de valeurs que vous essayez d'insérer correspond réellement au nombre de colonnes de la table.
Une meilleure façon de le faire est de spécifier explicitement les noms de colonne dans votre INSERT
déclaration. Cela vous évitera d'insérer accidentellement des données dans les mauvaises colonnes.
Donc, selon les valeurs que je veux insérer, je pourrais réécrire mon exemple comme suit :
INSERT INTO Customers (FirstName)
VALUES ('Jake');
Ou ceci :
INSERT INTO Customers (FirstName, LastName)
VALUES ('Jake', 'Smith');
Noms de colonne implicites
Comme mentionné, il est préférable d'épeler explicitement chaque nom de colonne dans votre INSERT
déclaration (comme je l'ai fait dans l'exemple précédent).
Je pourrais cependant modifier mon exemple pour utiliser des noms de colonnes implicites, comme ceci :
INSERT INTO Customers
VALUES (1, 'Jake', 'Smith');
Cependant, cela pourrait maintenant entraîner un problème distinct concernant la colonne d'identité. Voir Comment insérer une valeur explicite dans une colonne d'identité si vous avez besoin de le faire.