SQL Server-fejl Msg 206, Level 16 er en almindelig fejl, man får, når man indsætter data i en tabel.
Det sker, når du forsøger at indsætte data i en kolonne, der er inkompatibel med den datatype, du forsøger at indsætte.
Dette kan ske, hvis du ved et uheld forsøger at indsætte data i den forkerte kolonne (eller endda den forkerte tabel). Men det kan også ske, hvis du fejlagtigt antager, at SQL Server vil konvertere dataene for dig.
For at løse dette problem skal du sørge for, at du indsætter den korrekte datatype.
Eksempel på problemkode
Her er et eksempel på kode, der resulterer i denne fejl.
INSERT INTO Orders(OrderId, OrderDate, OrderDesc)
VALUES ('2020-04-02', 1, 'Dog food');
Resultat:
Msg 206, Level 16, State 2, Line 1 Operand type clash: int is incompatible with date
I dette tilfælde er det ret tydeligt, hvor jeg tager fejl, bare ved at se på kolonnenavnene og de værdier, jeg forsøger at indsætte.
Jeg forsøger at indsætte værdier i den forkerte rækkefølge.
Problemet er, at jeg forsøger at indsætte et heltal i en datokolonne. Specifikt forsøger jeg at indsætte værdien 1
ind i en kolonne kaldet OrderDate
.
Det er selvfølgelig ikke kolonnenavnet, der forårsager problemet. Det er den datatype, jeg forsøger at indsætte i den.
Her er koden, jeg brugte til at oprette tabellen:
CREATE TABLE Orders (
OrderId int NOT NULL,
OrderDate date NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrders PRIMARY KEY CLUSTERED(OrderId, OrderDate)
);
Vi kan se ved tabeldefinitionen, at OrderDate
kolonne bruger en dato datatype.
Velsignelse i forklædning?
Hvor frustrerende det end kan være at få en fejl, kan det nogle gange være det bedste, der nogensinde er sket for dig.
Hvis koden ikke resulterer i en fejl, kan vi ved et uheld indsætte de forkerte data i databasen. Dette ville mindske dataintegriteten af vores database.
Forestil dig, at OrderDate
kolonne er en datotid i stedet for dato :
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)
);
Forestil dig nu, at vi prøver at indsætte følgende data i den tabel:
INSERT INTO Orders(OrderId, OrderDate, OrderDesc)
VALUES (1, 1, 'Dog food');
Resultat:
(1 row affected)
Hvad? Ingen fejl?
Nemlig. Ingen fejl. Dette skyldes, at datetime type er kompatibel med int type. Med andre ord tog SQL Server vores int værdi og konverterede den til en datotid værdi.
Her er, hvordan vores bord ender med at se ud efter den indsættelseshandling.
SELECT * FROM Orders;
Resultat:
+-----------+-------------------------+-------------+ | OrderId | OrderDate | OrderDesc | |-----------+-------------------------+-------------| | 1 | 1900-01-02 00:00:00.000 | Dog food | +-----------+-------------------------+-------------+