Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Erreur SQL Server 206 :conflit de type d'opérande

L'erreur SQL Server Msg 206, niveau 16 est une erreur courante lors de l'insertion de données dans une table.

Cela se produit lorsque vous essayez d'insérer des données dans une colonne incompatible avec le type de données que vous essayez d'insérer.

Cela peut arriver si vous essayez accidentellement d'insérer des données dans la mauvaise colonne (ou même la mauvaise table). Mais cela peut également arriver si vous supposez à tort que SQL Server convertira les données pour vous.

Pour résoudre ce problème, assurez-vous d'insérer le bon type de données.

Exemple de code de problème

Voici un exemple de code qui génère cette erreur.

INSERT INTO Orders(OrderId, OrderDate, OrderDesc) 
VALUES ('2020-04-02', 1, 'Dog food');

Résultat :

Msg 206, Level 16, State 2, Line 1
Operand type clash: int is incompatible with date

Dans ce cas, il est assez évident que je me trompe, simplement en regardant les noms de colonne et les valeurs que j'essaie d'insérer.

J'essaie d'insérer des valeurs dans le mauvais ordre.

Le problème est que j'essaie d'insérer un entier dans une colonne de date. Plus précisément, j'essaie d'insérer la valeur 1 dans une colonne appelée OrderDate .

Bien sûr, ce n'est pas le nom de la colonne qui cause le problème. C'est le type de données que j'essaie d'y insérer.

Voici le code que j'ai utilisé pour créer le tableau :

CREATE TABLE Orders (
    OrderId int NOT NULL,
    OrderDate date NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT PKOrders PRIMARY KEY CLUSTERED(OrderId, OrderDate)
    );

Nous pouvons voir par la définition de table que le OrderDate la colonne utilise une date type de données.

Bénédiction déguisée ?

Aussi frustrant que cela puisse être d'obtenir une erreur, cela pourrait parfois être la meilleure chose qui vous soit jamais arrivée.

Si le code ne génère pas d'erreur, nous pourrions accidentellement insérer les mauvaises données dans la base de données. Cela diminuerait l'intégrité des données de notre base de données.

Imaginez que le OrderDate la colonne est une datetime au lieu de date :

DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders (
    OrderId int NOT NULL,
    OrderDate datetime NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT PKOrders PRIMARY KEY CLUSTERED(OrderId, OrderDate)
    );

Imaginons maintenant que nous essayons d'insérer les données suivantes dans cette table :

INSERT INTO Orders(OrderId, OrderDate, OrderDesc) 
VALUES (1, 1, 'Dog food');

Résultat :

(1 row affected)

Hein? Pas d'erreur ?

Exactement. Pas d'erreur. C'est parce que le datetime le type est compatible avec le int taper. En d'autres termes, SQL Server a pris notre int valeur et l'a convertie en datetime valeur.

Voici à quoi ressemble notre table après cette opération d'insertion.

SELECT * FROM Orders;

Résultat :

+-----------+-------------------------+-------------+
| OrderId   | OrderDate               | OrderDesc   |
|-----------+-------------------------+-------------|
| 1         | 1900-01-02 00:00:00.000 | Dog food    |
+-----------+-------------------------+-------------+