sql >> Databáze >  >> RDS >> Sqlserver

Chyba serveru SQL 206:Kolize typu operandu

Chyba serveru SQL Msg 206, úroveň 16 je běžná chyba, která se vyskytuje při vkládání dat do tabulky.

Stává se to, když se pokoušíte vložit data do sloupce, který není kompatibilní s typem dat, který se pokoušíte vložit.

K tomu může dojít, pokud se omylem pokusíte vložit data do nesprávného sloupce (nebo dokonce do špatné tabulky). Ale také se to může stát, pokud nesprávně předpokládáte, že SQL Server převede data za vás.

Chcete-li tento problém vyřešit, ujistěte se, že vkládáte správný typ dat.

Příklad kódu problému

Zde je příklad kódu, který vede k této chybě.

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

Výsledek:

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

V tomto případě je zcela zřejmé, kde dělám chybu, pouhým pohledem na názvy sloupců a hodnoty, které se snažím vložit.

Snažím se vkládat hodnoty ve špatném pořadí.

Problém je v tom, že se snažím vložit celé číslo do sloupce data. Konkrétně se snažím vložit hodnotu 1 do sloupce s názvem OrderDate .

Problém samozřejmě nezpůsobuje název sloupce. Je to datový typ, který se do něj pokouším vložit.

Zde je kód, který jsem použil k vytvoření tabulky:

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

Podle definice tabulky vidíme, že OrderDate sloupec používá datum datový typ.

Požehnání v přestrojení?

Chyba může být jakkoli frustrující, ale někdy to může být ta nejlepší věc, která se vám kdy stala.

Pokud kód nevede k chybě, můžeme omylem vložit do databáze nesprávná data. To by snížilo integritu dat naší databáze.

Představte si, že OrderDate sloupec je datum a čas místo 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)
    );

Nyní si představte, že se do této tabulky pokusíme vložit následující data:

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

Výsledek:

(1 row affected)

co? Žádná chyba?

Přesně tak. Žádná chyba. Důvodem je datum a čas typ je kompatibilní s int typ. Jinými slovy, SQL Server převzal náš int hodnotu a převedl ji na datum a čas hodnotu.

Takto naše tabulka po operaci vložení nakonec vypadá.

SELECT * FROM Orders;

Výsledek:

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


  1. PHP mysql prohledává více tabulek pomocí klíčového slova

  2. Pořadí hodnocení klauzule Oracle SQL

  3. Udělení práv na uloženou proceduru jinému uživateli Oracle

  4. STRING_SPLIT() v SQL Server 2016:Následná akce #1