Mặc dù các câu trả lời xuất sắc đã được thêm vào câu hỏi này, có một thứ tự ưu tiên được xác định rõ ràng để chuyển đổi các loại dữ liệu trong SQL Server.
Khi một toán tử kết hợp hai biểu thức của các loại dữ liệu khác nhau, các quy tắc về quyền ưu tiên loại dữ liệu xác định rằng loại dữ liệu có mức độ ưu tiên thấp hơn được chuyển đổi thành loại dữ liệu có độ ưu tiên cao hơn. Nếu chuyển đổi không phải là chuyển đổi ngầm được hỗ trợ, lỗi sẽ được trả về. Khi cả hai biểu thức toán hạng có cùng kiểu dữ liệu, kết quả của phép toán có kiểu dữ liệu đó.
SQL Server sử dụng thứ tự ưu tiên sau cho các loại dữ liệu:
user-defined data types (highest)
sql_variant
xml
datetimeoffset
datetime2
datetime
smalldatetime
date
time
float
real
decimal
money
smallmoney
bigint
int
smallint
tinyint
bit
ntext
text
image
timestamp
uniqueidentifier
nvarchar (including nvarchar(max) )
nchar
varchar (including varchar(max) )
char
varbinary (including varbinary(max) )
binary (lowest)
Vì vậy, ví dụ, nếu bạn SELECT 0.5 * 1
(nhân một số thập phân với một số nguyên), bạn sẽ nhận được một kết quả được chuyển đổi thành giá trị thập phân, vì decimal
nó có độ ưu tiên cao hơn int
loại dữ liệu.
Xem http://msdn.microsoft.com/en-us/l Library / ms190309.aspx để biết thêm chi tiết.
Đã nói tất cả, có lẽ SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1 ));
nên trả về một giá trị thập phân, vì thực tế tất cả các đầu vào là thập phân. Thật thú vị, bạn có thể buộc một kết quả chính xác bằng cách sửa đổi nó SELECT
thành:
DECLARE @N INT = 360;
DECLARE @I DECIMAL(38,26) = 0.15 * 30 / 360;
DECLARE @C DECIMAL(38,26) = 1000000;
SELECT @C * @I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1);
SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1E0 + @I, @N) - 1));
Điều này trả về:
Tôi không thể giải thích được điều đó tạo ra sự khác biệt như thế nào, mặc dù rõ ràng là có . Tôi đoán là 1E0
(một dấu phẩy rõ ràng) trong POWER(
hàm buộc SQL Server phải đưa ra lựa chọn khác về các loại đầu ra cho POWER
hàm. Nếu giả sử của tôi là chính xác, điều đó sẽ chỉ ra một lỗi có thể xảy ra trong POWER
hàm, vì tài liệu nêu đầu vào đầu tiên POWER()
là float hoặc một số có thể được chuyển đổi hoàn toàn thành float.