Hãy xem xét hai tuyên bố sau:
PRINT CONVERT(NUMERIC(38, 0), 0x0100000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x0100010001, 0);
Cả hai tuyên bố trở lại -1
; không phải là không chính xác vì giá trị nhị phân thứ hai là thập phân 65,536 cao hơn giá trị thứ nhất, phải không?
Chắc chắn điều này không thể là do cắt ngắn im lặng?
Nếu tôi chạy các câu lệnh sau:
PRINT CONVERT(NUMERIC(38, 0), 0x00000001, 0);
PRINT CONVERT(NUMERIC(38, 0), 0x00010001, 0);
Tôi gặp lỗi sau:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varbinary to numeric.
Làm thế nào tôi có thể chẩn đoán những gì đang xảy ra ở đây?
Tôi đang chạy cái này trên SQL Server 2012, v11.0.5058. Kết quả giống nhau trên SQL Server 2008 R2 SP2, SQL Server 2005 và SQL Server 2000.
Aaron là tại chỗ. Bộ não của bạn đang chuyển đổi dữ liệu nhị phân thành dữ liệu số nguyên sau đó chuyển thẳng sang số, nhưng SQL Server không thực hiện chuyển đổi ngầm định từ nhị phân -> số nguyên -> số (x, y). Để SQL Server tuân theo quy trình suy nghĩ của bạn, bạn phải làm một cái gì đó như thế này :
—
Thomas Stringer
PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00000001), 0); PRINT CONVERT(NUMERIC(38, 0), convert(int, 0x00010001), 0);
.
Byte đầu tiên là scale (0x01 = 1), byte thứ hai có độ chính xác (0x00 = 0), byte cuối cùng là giá trị (0x01 = 1). Không chắc chắn những gì ba và bốn là cho. Dấu hiệu ở đó nhưng không cần hai byte. Chắc chắn việc lật bit đó dường như không ảnh hưởng gì.
—
Martin Smith
Cảm ơn, @MartinSmith - làm thế nào trên trái đất bạn đã xác định hai byte đầu tiên được sử dụng như vậy? Đó có phải là tài liệu?
—
Max Vernon
@AaronBertrand: Bạn có muốn đưa ra câu trả lời không? Chúng tôi có thể đánh dấu điều này ra khỏi danh sách "chưa được trả lời".
—
Jon của tất cả các giao dịch
SELECT CONVERT(VARBINARY(32), 1), CONVERT(VARBINARY(32), 1.0);