sql >> Database >  >> RDS >> Sqlserver

SQL Server-fout 206:clash van operandtype

SQL Server-fout Msg 206, niveau 16 is een veelvoorkomende fout bij het invoegen van gegevens in een tabel.

Dit gebeurt wanneer u gegevens probeert in te voegen in een kolom die niet compatibel is met het gegevenstype dat u probeert in te voegen.

Dit kan gebeuren als u per ongeluk probeert gegevens in de verkeerde kolom (of zelfs de verkeerde tabel) in te voegen. Maar het kan ook gebeuren als u er ten onrechte van uitgaat dat SQL Server de gegevens voor u zal converteren.

Om dit probleem op te lossen, moet u ervoor zorgen dat u het juiste gegevenstype invoert.

Voorbeeld van probleemcode

Hier is een voorbeeld van code die in deze fout resulteert.

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

Resultaat:

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

In dit geval is het vrij duidelijk waar ik de fout in ga, gewoon door te kijken naar de kolomnamen en de waarden die ik probeer in te voegen.

Ik probeer waarden in de verkeerde volgorde in te voegen.

Het probleem is dat ik een geheel getal probeer in te voegen in een datumkolom. Ik probeer met name de waarde 1 . in te voegen in een kolom genaamd OrderDate .

Het is natuurlijk niet de kolomnaam die het probleem veroorzaakt. Het is het gegevenstype dat ik erin probeer in te voegen.

Dit is de code die ik heb gebruikt om de tabel te maken:

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

We kunnen aan de tabeldefinitie zien dat de OrderDate kolom gebruikt een datum gegevenstype.

Vermomde zegen?

Hoe frustrerend het ook kan zijn om een ​​foutmelding te krijgen, soms kan het het beste zijn dat je ooit is overkomen.

Als de code geen fout oplevert, kunnen we per ongeluk de verkeerde gegevens in de database invoeren. Dit zou de gegevensintegriteit van onze database verminderen.

Stel je voor dat de OrderDate kolom is een datetime in plaats van datum :

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

Stel je nu voor dat we proberen de volgende gegevens in die tabel in te voegen:

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

Resultaat:

(1 row affected)

Hoezo? Geen fout?

Precies. Geen fout. Dit komt omdat de datetime type is compatibel met de int type. Met andere woorden, SQL Server nam onze int waarde en omgezet in een datetime waarde.

Dit is hoe onze tabel eruitziet na die invoegbewerking.

SELECT * FROM Orders;

Resultaat:

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


  1. Postgresql repareren na upgrade naar OSX 10.7 Lion

  2. Hoe gebruik je een externe sleutel in sqlite?

  3. Zeer beschikbare databases en clusters implementeren met ClusterControl

  4. Werken met cPanel MySQL-databases