Meskipun jawaban yang sangat baik sudah ditambahkan ke pertanyaan ini, ada urutan prioritas yang didefinisikan secara eksplisit untuk konversi tipe data dalam SQL Server.
Ketika seorang operator menggabungkan dua ekspresi dari tipe data yang berbeda, aturan untuk presedensi tipe data menentukan bahwa tipe data dengan presedensi yang lebih rendah dikonversi ke tipe data dengan prioritas yang lebih tinggi. Jika konversi itu bukan konversi tersirat yang didukung, kesalahan dikembalikan. Ketika kedua ekspresi operan memiliki tipe data yang sama, hasil operasi memiliki tipe data tersebut.
SQL Server menggunakan urutan prioritas berikut untuk tipe data:
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)
Jadi, misalnya, jika Anda SELECT 0.5 * 1
(mengalikan desimal oleh int) Anda mendapatkan hasil yang dikonversi ke nilai desimal, karena decimal
ini lebih tinggi diutamakan daripada int
tipe data.
Lihat http://msdn.microsoft.com/en-us/library/ms190309.aspx untuk rincian lebih lanjut.
Setelah mengatakan semua itu, mungkin SELECT @C * (@I * POWER(1 + @I, @N) / (POWER(1 + @I, @N) - 1 ));
harus mengembalikan nilai desimal, karena praktis semua input adalah desimal. Menariknya, Anda dapat memaksakan hasil yang benar dengan memodifikasi itu SELECT
untuk:
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));
Ini mengembalikan:
Saya bingung menjelaskan bagaimana itu membuat perbedaan, meskipun jelas itu terjadi . Dugaan saya adalah 1E0
(float eksplisit) dalam POWER(
fungsi memaksa SQL Server untuk membuat pilihan berbeda pada tipe output untuk POWER
fungsi. Jika anggapan saya benar, itu akan menunjukkan kemungkinan bug dalam POWER
fungsi, karena dokumentasi menyatakan input pertama POWER()
adalah float, atau angka yang secara implisit dapat dikonversi menjadi float.