Tại sao CHỌN VÀO gây ra tràn số học?


7

Tôi đang làm việc này

SELECT * INTO table1 FROM Table0

Tôi nhận được một tràn số học trên cột datetime (lỗi chuyển đổi thành smalldatetime), tuy nhiên lược đồ đích được tạo có cột datetime chứ không phải cột smalldatetime ..

Câu trả lời:


7

Tôi nghe có vẻ như bạn có một chuyển đổi ngầm định thành thời gian nhỏ, có thể trong một cột được tính toán. Nếu bạn nhìn vào Kế hoạch thực hiện ước tính, có thể bạn sẽ thấy các phép tính vô hướng tính toán trong đó. Nhấn F4 để xem các thuộc tính và bạn sẽ có thể thấy các tính toán đang được thực hiện, bao gồm mọi chuyển đổi ngầm đang được sử dụng.


Vâng, có một cột được tính toán .. Cảm ơn tất cả!
WrinkleFree

1

Loại vấn đề này luôn là dấu hiệu của tham nhũng và có thể dễ dàng được gỡ lỗi với

DBCC CHECKTABLE(<tablename>) WITH DATA_PURITY;

DATA_PURITY
Gây ra KIỂM TRA DBCC để kiểm tra bảng cho các giá trị cột không hợp lệ hoặc nằm ngoài phạm vi. Ví dụ: DBCC CHECKTABLE phát hiện các cột có giá trị ngày và thời gian lớn hơn hoặc nhỏ hơn phạm vi chấp nhận được đối với loại dữ liệu thời gian; hoặc các cột kiểu dữ liệu thập phân hoặc gần đúng số với các giá trị tỷ lệ hoặc độ chính xác không hợp lệ.


Trên thực tế như đã đề cập trước đó, một cột được tính toán gây ra sự cố ..
WrinkleFree

Thực tế là cột được tính toán gây ra tràn về mặt kỹ thuật là tham nhũng và có thể được phát hiện bằng séc.
Remus Rusanu

1
@RemusRusanu - Đây có phải chỉ dành cho các cột được tính toán bền không? Nó không báo cáo bất cứ điều gì choCREATE TABLE T(Id int, X AS CAST('Fish' AS INT));INSERT INTO T DEFAULT VALUES;SELECT * INTO #T FROM T;DBCC CHECKTABLE(T) WITH DATA_PURITY;
Martin Smith

@MartinSmith: bạn nói đúng, độ tinh khiết của dữ liệu sẽ chỉ xác nhận định dạng lưu trữ (tức là các bit cột tồn tại trên đĩa). Tôi đã rất ngạc nhiên bởi thực tế là bạn có thể tạo cột được tính toán, rõ ràng DDL không bao giờ đánh giá biểu thức, nhưng trên suy nghĩ thứ hai đó là bình thường. Cột được tính toán thường phụ thuộc vào dữ liệu hàng và trong quá trình TẠO không có hàng, vì vậy nó không thể được đánh giá. Trong ALTER ... THÊM ... nó có thể được đánh giá, nhưng không có hàng 'phân biệt' để thử nó, vì vậy nó có nghĩa là xác thực quét kích thước dữ liệu trên tất cả các hàng.
Remus Rusanu

1
Hãy nghĩ về nó như là một tính năng để nắm bắt việc sử dụng không lành mạnh SELECT *:) alter table t add [Thou Shall Not Use *] AS 1/0;.
Remus Rusanu
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.