Di bawah ini adalah daftar yang berisi tipe data SQL Server, dalam urutan prioritas.
- tipe data yang ditentukan pengguna (tertinggi)
sql_variantxmldatetimeoffsetdatetime2datetimesmalldatetimedatetimefloatrealdecimalmoneysmallmoneybigintintsmallinttinyintbitntexttextimagetimestampuniqueidentifiernvarchar(termasuknvarchar(max))ncharvarchar(termasukvarchar(max))charvarbinary(termasukvarbinary(max))binary(terendah)
Saat Anda menggunakan operator untuk menggabungkan operan dari tipe data yang berbeda, tipe data dengan prioritas lebih rendah pertama-tama dikonversi ke tipe data dengan prioritas lebih tinggi.
Jika konversi bukan konversi implisit yang didukung, kesalahan akan ditampilkan.
Jika kedua operan bertipe sama, maka tidak ada konversi yang dilakukan (atau diperlukan) dan hasil operasi menggunakan tipe data operan.
Contoh
Berikut contoh konversi implisit yang berhasil:
SELECT 1 * 1.00; Hasil:
1.00
Di sini, operan kiri diubah menjadi tipe data operan kanan.
Berikut cara yang lebih eksplisit untuk melakukannya:
DECLARE
@n1 INT,
@n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1 * @n2; Hasil:
1.00
Dalam hal ini saya secara eksplisit mendeklarasikan operan kiri sebagai INT dan operan kanan sebagai DECIMAL(5, 2) .
Kami dapat memeriksa hasilnya lebih lanjut dengan sys.dm_exec_describe_first_result_set fungsi manajemen dinamis sistem.
Fungsi ini memungkinkan kami untuk memeriksa tipe data dari setiap kolom yang dikembalikan dalam kueri:
SELECT
system_type_name,
max_length,
[precision],
scale
FROM sys.dm_exec_describe_first_result_set(
'DECLARE @n1 INT, @n2 DECIMAL(5, 2);
SET @n1 = 1;
SET @n2 = 1;
SELECT @n1, @n2, @n1 * @n2;',
null,
0); Hasil:
+--------------------+--------------+-------------+---------+ | system_type_name | max_length | precision | scale | |--------------------+--------------+-------------+---------| | int | 4 | 10 | 0 | | decimal(5,2) | 5 | 5 | 2 | | decimal(16,2) | 9 | 16 | 2 | +--------------------+--------------+-------------+---------+
Di sini, kita dapat melihat bahwa setiap baris mewakili setiap kolom yang dikembalikan oleh kueri. Oleh karena itu, kolom pertama adalah INT , kolom kedua adalah DECIMAL(5,2) , dan kolom ketiga a DECIMAL(16,2) .
Jadi SQL Server benar-benar mengembalikan DECIMAL(16,2) , meskipun nilai desimal aslinya adalah a DECIMAL(5,2) .
Contoh Kesalahan Konversi
Seperti yang disebutkan, jika konversi bukan konversi implisit yang didukung, kesalahan akan ditampilkan:
SELECT 'Age: ' + 10; Hasil:
Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the varchar value 'Age: ' to data type int.
Dalam hal ini, saya mencoba menggabungkan string (VARCHAR ) dan angka (INT ). Melihat sebagai INT memiliki prioritas lebih tinggi daripada VARCHAR , SQL Server mencoba mengonversi string secara implisit menjadi INT .
Ini gagal, karena string ini tidak dapat dikonversi ke bilangan bulat.
Untuk mengatasinya, kita bisa mengonversi dulu INT ke VARCHAR :
SELECT 'Age: ' + CAST(10 AS VARCHAR(2)); Hasil:
Age: 10
Sekarang kedua operan memiliki tipe data yang sama, sehingga SQL Server melakukan operasi dengan sukses tanpa perlu melakukan konversi implisit apa pun.
Cara lain untuk melakukan operasi khusus ini adalah dengan CONCAT() fungsi:
SELECT CONCAT('Age: ', 10); Hasil:
Age: 10
CONCAT() function adalah fungsi string dan oleh karena itu secara implisit mengonversi semua argumen ke tipe string sebelum penggabungan. Oleh karena itu, kami tidak perlu melakukan konversi eksplisit.
Namun, jika operan string dapat dikonversi secara implisit menjadi angka, maka tidak akan menyebabkan kesalahan saat menggunakan + operator:
SELECT '10' + 10; Hasil:
20
Namun dalam kasus ini, + operator berubah menjadi operator matematika tambahan, bukan operator rangkaian string.