sql >> Base de Datos >  >> RDS >> Sqlserver

Error 206 de SQL Server:conflicto de tipo de operando

El error de SQL Server Msg 206, Nivel 16 es un error común al insertar datos en una tabla.

Ocurre cuando intenta insertar datos en una columna que es incompatible con el tipo de datos que intenta insertar.

Esto podría suceder si accidentalmente intenta insertar datos en la columna incorrecta (o incluso en la tabla incorrecta). Pero también podría suceder si asume incorrectamente que SQL Server convertirá los datos por usted.

Para solucionar este problema, asegúrese de insertar el tipo de datos correcto.

Ejemplo de código de problema

Este es un ejemplo de código que genera este error.

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

Resultado:

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

En este caso, es bastante obvio dónde me equivoco, simplemente mirando los nombres de las columnas y los valores que estoy tratando de insertar.

Estoy tratando de insertar valores en el orden incorrecto.

El problema es que estoy tratando de insertar un número entero en una columna de fecha. Específicamente, estoy tratando de insertar el valor 1 en una columna llamada OrderDate .

Por supuesto, no es el nombre de la columna lo que está causando el problema. Es el tipo de datos que estoy tratando de insertar en él.

Aquí está el código que usé para crear la tabla:

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

Podemos ver por la definición de la tabla que OrderDate la columna usa una fecha tipo de datos.

¿Bendición disfrazada?

Tan frustrante como puede ser recibir un error, a veces puede ser lo mejor que te haya pasado.

Si el código no da como resultado un error, podríamos insertar accidentalmente datos incorrectos en la base de datos. Esto disminuiría la integridad de los datos de nuestra base de datos.

Imagina que OrderDate la columna es una fecha y hora en lugar de fecha :

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

Ahora imagina que tratamos de insertar los siguientes datos en esa tabla:

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

Resultado:

(1 row affected)

¿Eh? ¿Ningún error?

Exactamente. No hay error. Esto se debe a que la fecha y hora tipo es compatible con int tipo. En otras palabras, SQL Server tomó nuestro int valor y lo convirtió en una fecha y hora valor.

Así es como queda nuestra tabla después de esa operación de inserción.

SELECT * FROM Orders;

Resultado:

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