Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Грешка на SQL Server 206:Сблъсък на тип операнд

Грешка на SQL Server Msg 206, ниво 16 е често срещана грешка при вмъкване на данни в таблица.

Това се случва, когато се опитвате да вмъкнете данни в колона, която е несъвместима с типа данни, който се опитвате да вмъкнете.

Това може да се случи, ако случайно се опитате да вмъкнете данни в грешна колона (или дори в грешна таблица). Но може да се случи и ако неправилно приемете, че SQL Server ще преобразува данните вместо вас.

За да отстраните този проблем, уверете се, че вмъквате правилния тип данни.

Пример за код на проблем

Ето пример за код, който води до тази грешка.

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

Резултат:

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

В този случай е съвсем очевидно къде греша, просто като погледна имената на колоните и стойностите, които се опитвам да вмъкна.

Опитвам се да вмъкна стойности в грешен ред.

Проблемът е, че се опитвам да вмъкна цяло число в колона за дата. По-конкретно, опитвам се да вмъкна стойността 1 в колона, наречена OrderDate .

Разбира се, не името на колоната причинява проблема. Това е типът данни, който се опитвам да вмъкна в него.

Ето кода, който използвах за създаване на таблицата:

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

От дефиницията на таблицата можем да видим, че OrderDate колоната използва дата тип данни.

Прикрита благословия?

Колкото и разочароващо да е да получите грешка, понякога това може да е най-доброто нещо, което някога ви се е случвало.

Ако кодът не доведе до грешка, може случайно да вмъкнем грешни данни в базата данни. Това би намалило целостта на данните на нашата база данни.

Представете си, че OrderDate колоната е дата и час вместо дата :

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

Сега си представете, че се опитваме да вмъкнем следните данни в тази таблица:

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

Резултат:

(1 row affected)

а? Няма грешка?

Точно. Няма грешка. Това е така, защото datetime типът е съвместим с int Тип. С други думи, SQL Server взе нашия int стойност и я преобразува в datetime стойност.

Ето как изглежда нашата таблица след тази операция на вмъкване.

SELECT * FROM Orders;

Резултат:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - Изваждане на изчерпваща стойност от редове

  2. Промяна на известието със Sql Server 2008

  3. Производителност на SQL Server 2005 заявка

  4. Йерархичен списък на типовете тригерни събития в SQL Server 2017

  5. Примери за преобразуване на „smalldatetime“ в „datetime“ в SQL Server (T-SQL)