Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Lỗi SQL Server 206:Xung đột kiểu toán hạng

Lỗi SQL Server Msg 206, Mức 16 là một lỗi thường gặp khi chèn dữ liệu vào bảng.

Điều này xảy ra khi bạn đang cố gắng chèn dữ liệu vào một cột không tương thích với loại dữ liệu bạn đang cố gắng chèn.

Điều này có thể xảy ra nếu bạn vô tình cố gắng chèn dữ liệu vào cột sai (hoặc thậm chí sai bảng). Nhưng nó cũng có thể xảy ra nếu bạn giả định không chính xác rằng SQL Server sẽ chuyển đổi dữ liệu cho bạn.

Để khắc phục sự cố này, hãy đảm bảo rằng bạn đang chèn đúng loại dữ liệu.

Ví dụ về Mã sự cố

Dưới đây là một ví dụ về mã dẫn đến lỗi này.

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

Kết quả:

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

Trong trường hợp này, rõ ràng là tôi đã sai ở đâu, chỉ bằng cách nhìn vào tên cột và các giá trị mà tôi đang cố gắng chèn.

Tôi đang cố gắng chèn các giá trị không đúng thứ tự.

Vấn đề là tôi đang cố chèn một số nguyên vào cột ngày tháng. Cụ thể, tôi đang cố chèn giá trị 1 vào một cột có tên là OrderDate .

Tất nhiên, đó không phải là tên cột gây ra sự cố. Đó là loại dữ liệu mà tôi đang cố chèn vào đó.

Đây là mã tôi đã sử dụng để tạo bảng:

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

Chúng ta có thể thấy bằng định nghĩa bảng rằng OrderDate cột sử dụng ngày kiểu dữ liệu.

Ban phước khi ngụy trang?

Thật khó chịu khi gặp lỗi, đôi khi đó có thể là điều tốt nhất từng xảy ra với bạn.

Nếu mã không dẫn đến lỗi, chúng tôi có thể vô tình chèn dữ liệu sai vào cơ sở dữ liệu. Điều này sẽ làm giảm tính toàn vẹn dữ liệu của cơ sở dữ liệu của chúng tôi.

Hãy tưởng tượng rằng OrderDate cột là ngày giờ thay vì ngày :

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

Bây giờ, hãy tưởng tượng chúng ta cố gắng chèn dữ liệu sau vào bảng đó:

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

Kết quả:

(1 row affected)

Huh? Không có lỗi?

Một cách chính xác. Không có lỗi. Điều này là do ngày giờ loại tương thích với int gõ phím. Nói cách khác, SQL Server đã lấy int của chúng tôi và chuyển đổi nó thành ngày giờ giá trị.

Đây là bảng của chúng ta trông như thế nào sau thao tác chèn đó.

SELECT * FROM Orders;

Kết quả:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cấp quyền truy cập người dùng msdb vào hồ sơ thư cơ sở dữ liệu trong SQL Server (T-SQL)

  2. Cách hiệu quả nhất trong SQL Server để lấy ngày từ ngày + giờ?

  3. Chèn các hàng vào bảng chỉ với một cột IDENTITY

  4. GIỮA Toán tử logic trong SQL Server là gì - Hướng dẫn sử dụng SQL Server / TSQL Phần 124

  5. Có cách nào để nhúng báo cáo power bi và bảng điều khiển vào ứng dụng vb.net hoặc C # trên máy tính để bàn với cơ sở dữ liệu sql server 2008 không?