Tràn số học trên truy vấn SELECT


9

Tôi đã gặp một tràn số học trong một câu lệnh CHỌN đơn giản. Truy vấn như dưới đây, vd

SELECT [SaleValue] FROM Sales

[SaleValue]là loại dữ liệu decimal(9,0)và không phải là một cột được tính toán.

Lý do điều này xảy ra là vì bằng cách nào đó, cột có một hàng trong đó trường này đang lưu trữ một giá trị TUYỆT VỜI hơn kiểu dữ liệu được chỉ định, ví dụ decimal(10,0).

Tôi chỉ có thể có được lựa chọn để làm việc khi tôi tăng kích thước của cột. Bảng trong câu hỏi có hai trường hợp khác trong hai cột và hàng khác.

Làm thế nào là tình huống này có thể? Làm thế nào một giá trị ngoài phạm vi được lưu trong cột ở vị trí đầu tiên?

Tôi đang sử dụng máy chủ Microsoft SQL + đây là bảng cơ sở, không phải dạng xem.


1
Cách khả thi duy nhất tôi có thể nghĩ có thể buộc điều này xảy ra là chỉnh sửa các bảng hệ thống thông qua DAC - một quy trình khá bạo lực mà ai đó hy vọng có thể cho bạn biết nếu nó đã được thực hiện với DB này. Ngay cả sau đó tôi không chắc nó sẽ hoạt động tốt (hoặc thậm chí có thể). Ngoài ra, chúng tôi thực sự cần một kịch bản repro để xem tình huống này cho chính mình và tôi nghi ngờ việc tạo ra repro, nếu có thể, có thể dễ dàng mất nhiều năm thử nghiệm.
Damien_The_Unbeliever

Thậm chí tệ hơn, chỉ cần nhớ rằng 9/10 là một điểm cắt cho kích thước lưu trữ của decimal- decimal(9,0)nên chiếm 5 byte, một decimal(10,0)9. Vì vậy, tôi nghĩ rằng ít có khả năng bạn có thể làm điều này thông qua chỉnh sửa các bảng hệ thống vì bạn sẽ không có kích thước lưu trữ chính xác cho dữ liệu trong mỗi hàng.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever Không biết làm thế nào để sao chép. Tôi mất một giờ để tìm hiểu chuyện gì đã xảy ra. Nhìn thấy nó giống như nhìn thấy nước khô hoặc nóng lạnh. Thành thật mà nói, nó khiến tôi bối rối.

Câu trả lời:


15

Điều này có thể xảy ra theo một số cách, ví dụ như được mô tả trong Khắc phục sự cố lỗi DBCC 2570 trong SQL Server 2005 và các phiên bản mới hơn :

Dữ liệu không hợp lệ hoặc ngoài phạm vi có thể đã được lưu trữ trong cơ sở dữ liệu SQL Server trong các phiên bản trước vì các lý do sau:

  • Dữ liệu không hợp lệ đã có trong nguồn trong khi sử dụng các phương thức chèn số lượng lớn, chẳng hạn như tiện ích bcp.
  • Dữ liệu không hợp lệ được truyền qua các cuộc gọi sự kiện RPC được thực hiện cho SQL Server.
  • Các nguyên nhân tiềm ẩn khác của tham nhũng dữ liệu vật lý khiến giá trị cột ở trạng thái không hợp lệ.

Bài viết đó chứa rất nhiều thông tin hữu ích về chủ đề này. Đối với những điều cơ bản, xem tài liệu cụ thể DBCC CHECKDBDATA_PURITYtùy chọn nói riêng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.