Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Erro 206 do SQL Server:conflito de tipo de operando


Erro do SQL Server Msg 206, Level 16 é um erro comum ao inserir dados em uma tabela.

Isso acontece quando você está tentando inserir dados em uma coluna que é incompatível com o tipo de dados que está tentando inserir.

Isso pode acontecer se você acidentalmente tentar inserir dados na coluna errada (ou até mesmo na tabela errada). Mas também pode acontecer se você assumir incorretamente que o SQL Server converterá os dados para você.

Para corrigir esse problema, verifique se você está inserindo o tipo de dados correto.

Exemplo de código de problema


Aqui está um exemplo de código que resulta nesse erro.
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

Nesse caso, é bastante óbvio onde estou errando, apenas observando os nomes das colunas e os valores que estou tentando inserir.

Estou tentando inserir valores na ordem errada.

O problema é que estou tentando inserir um inteiro em uma coluna de data. Especificamente, estou tentando inserir o valor 1 em uma coluna chamada OrderDate .

Claro, não é o nome da coluna que está causando o problema. É o tipo de dados que estou tentando inserir nele.

Aqui está o código que usei para criar a tabela:
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 pela definição da tabela que o OrderDate coluna usa uma data tipo de dados.

Bênção disfarçada?


Por mais frustrante que seja receber um erro, às vezes pode ser a melhor coisa que já aconteceu com você.

Se o código não resultar em erro, podemos inserir acidentalmente os dados errados no banco de dados. Isso diminuiria a integridade dos dados do nosso banco de dados.

Imagine que o OrderDate coluna é uma data e hora em vez de 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)
    );

Agora imagine que tentamos inserir os seguintes dados nessa tabela:
INSERT INTO Orders(OrderId, OrderDate, OrderDesc) 
VALUES (1, 1, 'Dog food');

Resultado:
(1 row affected)

Huh? Nenhum erro?

Exatamente. Nenhum erro. Isso ocorre porque o datetime tipo é compatível com o int tipo. Em outras palavras, o SQL Server pegou nosso int valor e o converteu em um datetime valor.

Aqui está como nossa tabela acaba ficando depois dessa operação de inserção.
SELECT * FROM Orders;

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