sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server Error 206:Operand typ clash

SQL Server error Msg 206, Level 16 är ett vanligt fel att få när man infogar data i en tabell.

Det händer när du försöker infoga data i en kolumn som är inkompatibel med datatypen du försöker infoga.

Detta kan hända om du av misstag försöker infoga data i fel kolumn (eller till och med fel tabell). Men det kan också hända om du felaktigt antar att SQL Server kommer att konvertera data åt dig.

För att åtgärda det här problemet, se till att du anger rätt datatyp.

Exempel på problemkod

Här är ett exempel på kod som resulterar i det här felet.

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

Resultat:

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

I det här fallet är det ganska uppenbart var jag gör fel, bara genom att titta på kolumnnamnen och värdena jag försöker infoga.

Jag försöker infoga värden i fel ordning.

Problemet är att jag försöker infoga ett heltal i en datumkolumn. Specifikt försöker jag infoga värdet 1 i en kolumn som heter OrderDate .

Naturligtvis är det inte kolumnnamnet som orsakar problemet. Det är datatypen som jag försöker infoga i den.

Här är koden jag använde för att skapa tabellen:

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

Vi kan se genom tabelldefinitionen att OrderDate kolumnen använder ett datum datatyp.

Välsignelse i förklädnad?

Hur frustrerande det än kan vara att få ett fel, ibland kan det vara det bästa som någonsin hänt dig.

Om koden inte resulterar i ett fel kan vi av misstag infoga fel data i databasen. Detta skulle minska dataintegriteten för vår databas.

Föreställ dig att OrderDate kolumnen är en datumtid istället för datum :

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)
    );

Föreställ dig nu att vi försöker infoga följande data i den tabellen:

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

Resultat:

(1 row affected)

Va? Inget fel?

Exakt. Inget fel. Detta beror på att datetime typ är kompatibel med int typ. Med andra ord tog SQL Server vår int värde och konverterade det till en datetime värde.

Så här ser vårt bord ut efter insättningsoperationen.

SELECT * FROM Orders;

Resultat:

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


  1. Använd OBJECTPROPERTY() för att ta reda på om en tabell är en systemtabell i SQL Server

  2. Hur SYSDATE() fungerar i MariaDB

  3. spara python objekt i postgres bord med pickle

  4. Hur man säkrar MySQL/MariaDB-servrar