Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Błąd serwera SQL 206:konflikt typu operandu

Błąd programu SQL Server Komunikat 206, poziom 16 jest częstym błędem, który można uzyskać podczas wstawiania danych do tabeli.

Dzieje się tak, gdy próbujesz wstawić dane do kolumny, która jest niezgodna z typem danych, który próbujesz wstawić.

Może się to zdarzyć, jeśli przypadkowo spróbujesz wstawić dane do niewłaściwej kolumny (lub nawet niewłaściwej tabeli). Ale może się to również zdarzyć, jeśli błędnie założysz, że SQL Server przekonwertuje dane za Ciebie.

Aby rozwiązać ten problem, upewnij się, że wstawiasz prawidłowy typ danych.

Przykład kodu problemu

Oto przykład kodu, który powoduje ten błąd.

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

Wynik:

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

W tym przypadku jest dość oczywiste, gdzie się mylę, po prostu patrząc na nazwy kolumn i wartości, które próbuję wstawić.

Próbuję wstawić wartości w złej kolejności.

Problem polega na tym, że próbuję wstawić liczbę całkowitą do kolumny daty. W szczególności próbuję wstawić wartość 1 do kolumny o nazwie OrderDate .

Oczywiście to nie nazwa kolumny powoduje problem. To typ danych, który próbuję w nim wstawić.

Oto kod, którego użyłem do stworzenia tabeli:

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

Po definicji tabeli widzimy, że OrderDate kolumna używa daty typ danych.

Błogosławieństwo w przebraniu?

Chociaż błąd może być frustrujący, czasami może to być najlepsza rzecz, jaka ci się przydarzyła.

Jeśli kod nie spowoduje błędu, możemy przypadkowo wstawić nieprawidłowe dane do bazy danych. Zmniejszyłoby to integralność danych naszej bazy danych.

Wyobraź sobie, że OrderDate kolumna to data i godzina zamiast data :

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

Teraz wyobraź sobie, że próbujemy wstawić do tej tabeli następujące dane:

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

Wynik:

(1 row affected)

Co? Nie ma błędu?

Dokładnie tak. Żaden błąd. Dzieje się tak, ponieważ data i godzina typ jest zgodny z int rodzaj. Innymi słowy, SQL Server wziął nasze int wartość i przekonwertowała ją na datę i godzinę wartość.

Oto jak wygląda nasza tabela po tej operacji wstawiania.

SELECT * FROM Orders;

Wynik:

+-----------+-------------------------+-------------+
| 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. Pobierz podciąg w SQL Server

  2. Szybko wstawiaj 2 miliony wierszy do SQL Server

  3. SQLServer a StateServer dla wydajności stanu sesji ASP.NET

  4. Jaki typ danych powinien być używany do przechowywania numerów telefonów w SQL Server 2005?

  5. Jak uzyskać listę wszystkich języków w SQL Server (T-SQL)