Di bawah ini adalah daftar yang berisi tipe data SQL Server, dalam urutan prioritas.
- tipe data yang ditentukan pengguna (tertinggi)
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
(termasuknvarchar(max)
)nchar
varchar
(termasukvarchar(max)
)char
varbinary
(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.