Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Errore di SQL Server 206:conflitto di tipo operando

Errore di SQL Server Msg 206, livello 16 è un errore comune da ottenere quando si inseriscono dati in una tabella.

Succede quando stai cercando di inserire dati in una colonna incompatibile con il tipo di dati che stai cercando di inserire.

Ciò potrebbe accadere se si tenta accidentalmente di inserire dati nella colonna sbagliata (o anche nella tabella sbagliata). Ma potrebbe anche accadere se si presume erroneamente che SQL Server converta i dati per te.

Per risolvere questo problema, assicurati di inserire il tipo di dati corretto.

Esempio di codice problema

Ecco un esempio di codice che genera questo errore.

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

Risultato:

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

In questo caso, è abbastanza ovvio dove sbaglio, semplicemente guardando i nomi delle colonne e i valori che sto cercando di inserire.

Sto cercando di inserire i valori nell'ordine sbagliato.

Il problema è che sto cercando di inserire un numero intero in una colonna di data. In particolare, sto cercando di inserire il valore 1 in una colonna denominata OrderDate .

Ovviamente, non è il nome della colonna a causare il problema. È il tipo di dati che sto cercando di inserirvi.

Ecco il codice che ho usato per creare la tabella:

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

Possiamo vedere dalla definizione della tabella che OrderDate la colonna utilizza una data tipo di dati.

Benedizione sotto mentite spoglie?

Per quanto possa essere frustrante ricevere un errore, a volte potrebbe essere la cosa migliore che ti sia mai capitata.

Se il codice non genera un errore, potremmo inserire accidentalmente i dati sbagliati nel database. Ciò ridurrebbe l'integrità dei dati del nostro database.

Immagina che il OrderDate la colonna è una data/ora invece di 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)
    );

Ora immagina di provare a inserire i seguenti dati in quella tabella:

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

Risultato:

(1 row affected)

Eh? Nessun errore?

Esattamente. Nessun errore. Questo perché il datetime il tipo è compatibile con int genere. In altre parole, SQL Server ha preso il nostro int valore e convertito in un datetime valore.

Ecco come appare la nostra tabella dopo quell'operazione di inserimento.

SELECT * FROM Orders;

Risultato:

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