Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Prioritas Tipe Data di SQL Server

Di bawah ini adalah daftar yang berisi tipe data SQL Server, dalam urutan prioritas.

  1. tipe data yang ditentukan pengguna (tertinggi)
  2. sql_variant
  3. xml
  4. datetimeoffset
  5. datetime2
  6. datetime
  7. smalldatetime
  8. date
  9. time
  10. float
  11. real
  12. decimal
  13. money
  14. smallmoney
  15. bigint
  16. int
  17. smallint
  18. tinyint
  19. bit
  20. ntext
  21. text
  22. image
  23. timestamp
  24. uniqueidentifier
  25. nvarchar (termasuk nvarchar(max) )
  26. nchar
  27. varchar (termasuk varchar(max) )
  28. char
  29. varbinary (termasuk varbinary(max) )
  30. 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TSQL Pivot tanpa fungsi agregat

  2. Ekspor data dari SQL Server ke Excel dan file Teks menggunakan paket SSIS

  3. C# Setara dengan Tipe Data SQL Server

  4. Cara Membuat Prosedur Tersimpan di SQL Server

  5. Cara Tercepat untuk Menjalankan Kueri yang Sama Beberapa Kali di SQL Server