Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Fehler 206:Konflikt zwischen Operandentyp

SQL Server error Msg 206, Level 16 ist ein häufiger Fehler, der beim Einfügen von Daten in eine Tabelle auftritt.

Dies passiert, wenn Sie versuchen, Daten in eine Spalte einzufügen, die mit dem einzufügenden Datentyp nicht kompatibel ist.

Dies könnte passieren, wenn Sie versehentlich versuchen, Daten in die falsche Spalte (oder sogar die falsche Tabelle) einzufügen. Es könnte aber auch passieren, wenn Sie fälschlicherweise davon ausgehen, dass SQL Server die Daten für Sie konvertiert.

Stellen Sie zur Behebung dieses Problems sicher, dass Sie den richtigen Datentyp einfügen.

Beispiel für Problemcode

Hier ist ein Codebeispiel, das zu diesem Fehler führt.

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

Ergebnis:

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

In diesem Fall ist es ziemlich offensichtlich, wo ich falsch liege, wenn ich mir nur die Spaltennamen und die Werte ansehe, die ich einzufügen versuche.

Ich versuche, Werte in der falschen Reihenfolge einzufügen.

Das Problem ist, dass ich versuche, eine Ganzzahl in eine Datumsspalte einzufügen. Insbesondere versuche ich, den Wert 1 einzufügen in eine Spalte namens OrderDate .

Natürlich ist es nicht der Spaltenname, der das Problem verursacht. Es ist der Datentyp, den ich versuche einzufügen.

Hier ist der Code, den ich zum Erstellen der Tabelle verwendet habe:

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

Wir können an der Tabellendefinition erkennen, dass das OrderDate Spalte verwendet ein Datum Datentyp.

Verborgener Segen?

So frustrierend es auch sein kann, eine Fehlermeldung zu erhalten, manchmal könnte es das Beste sein, was Ihnen je passiert ist.

Wenn der Code nicht zu einem Fehler führt, könnten wir versehentlich die falschen Daten in die Datenbank einfügen. Dies würde die Datenintegrität unserer Datenbank beeinträchtigen.

Stellen Sie sich vor, das OrderDate Spalte ist ein datetime statt 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)
    );

Stellen Sie sich nun vor, wir versuchen, die folgenden Daten in diese Tabelle einzufügen:

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

Ergebnis:

(1 row affected)

Häh? Kein Fehler?

Genau. Kein Fehler. Das liegt daran, dass datetime type ist kompatibel mit int Typ. Mit anderen Worten, SQL Server hat unsere int übernommen -Wert und konvertierte ihn in ein datetime Wert.

So sieht unsere Tabelle nach diesem Einfügevorgang aus.

SELECT * FROM Orders;

Ergebnis:

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