Kolase Prioritas

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft Fabric

Kolase diutamakan, juga dikenal sebagai aturan pemaksaan kolase, menentukan hal-hal berikut:

  • Kolatasi hasil akhir ekspresi yang dievaluasi ke string karakter.

  • Kolase yang digunakan oleh operator sensitif kolase yang menggunakan input string karakter tetapi tidak mengembalikan string karakter, seperti LIKE dan IN.

Aturan prioritas kolase hanya berlaku untuk jenis data string karakter: karakter, varchar, teks, nchar, nvarchar, dan ntext. Objek yang memiliki jenis data lain tidak berpartisipasi dalam evaluasi kolaborasi.

Label Kolabasi

Tabel berikut mencantumkan dan menjelaskan empat kategori di mana kolase semua objek diidentifikasi. Nama setiap kategori disebut label kolabasi.

Label kolabasi Jenis objek
Coercible-default Setiap variabel string karakter Transact-SQL, parameter, literal, atau output fungsi bawaan katalog, atau fungsi bawaan yang tidak mengambil input string tetapi menghasilkan output string.

Jika objek dideklarasikan dalam fungsi yang ditentukan pengguna, prosedur tersimpan, atau pemicu, objek diberi kolase default database tempat fungsi, prosedur tersimpan, atau pemicu dibuat. Jika objek dideklarasikan dalam batch, objek diberi kolase default database saat ini untuk koneksi.
X Implisit Referensi kolom. Kolatasi ekspresi (X) diambil dari kolate yang ditentukan untuk kolom dalam tabel atau tampilan.

Bahkan jika kolom secara eksplisit menetapkan kolase dengan menggunakan klausa COLLATE dalam pernyataan CREATE TABLE atau CREATE VIEW, referensi kolom diklasifikasikan sebagai implisit.
X Eksplisit Ekspresi yang secara eksplisit ditransmisikan ke kolate tertentu (X) dengan menggunakan klausa COLLATE dalam ekspresi.
Tanpa kolatasi Menunjukkan bahwa nilai ekspresi adalah hasil operasi antara dua string yang memiliki kolatasi yang bertentangan dari label kolabasi implisit. Hasil ekspresi didefinisikan sebagai tidak memiliki kolase.

Aturan Kolafasi

Label kolater ekspresi sederhana yang hanya mereferensikan satu objek string karakter adalah label kolater objek yang direferensikan.

Label kolas ekspresi kompleks yang mereferensikan dua ekspresi operand dengan label kolab yang sama adalah label kolab ekspresi operand.

Label kolab hasil akhir ekspresi kompleks yang mereferensikan dua ekspresi operand dengan kolatasi yang berbeda didasarkan pada aturan berikut:

  • Eksplisit lebih diutamakan daripada implisit. Implisit lebih diutamakan daripada Coercible-default:

    Implisit > Implisit > Coercible-default

  • Menggabungkan dua ekspresi Eksplisit yang telah ditetapkan kolase yang berbeda menghasilkan kesalahan:

    Eksplisit X + Eksplisit Y = Kesalahan

  • Menggabungkan dua ekspresi Implisit yang memiliki kolatasi yang berbeda menghasilkan hasil dari Tanpa kolatasi:

    Implisit X + Implisit Y = Tanpa kolatasi

  • Menggabungkan ekspresi dengan No-collation dengan ekspresi label apa pun, kecuali Kolacek eksplisit (lihat aturan berikut), menghasilkan hasil yang memiliki label Tanpa kolaksi:

    No-collation + anything = No-collation

  • Menggabungkan ekspresi dengan No-collation dengan ekspresi yang memiliki kolas Eksplisit, menghasilkan ekspresi dengan label Eksplisit:

    No-collation + Explicit X = Explicit

Tabel berikut ini meringkas aturan.

Label koersi operan X Eksplisit X Implisit Coercible-default Tanpa kolatasi
Y Eksplisit Menghasilkan Kesalahan Hasilnya adalah Eksplisit Y Hasilnya adalah Eksplisit Y Hasilnya adalah Eksplisit Y
Implisit Y Hasilnya adalah Eksplisit X Hasilnya adalah No-collation Hasilnya adalah Implisit Y Hasilnya adalah No-collation
Coercible-default Hasilnya adalah Eksplisit X Hasilnya adalah Implisit X Hasilnya adalah Coercible-default Hasilnya adalah No-collation
Tanpa kolatasi Hasilnya adalah Eksplisit X Hasilnya adalah No-collation Hasilnya adalah No-collation Hasilnya adalah No-collation

Aturan tambahan berikut ini juga berlaku untuk kolase prioritas:

  • Anda tidak dapat memiliki beberapa klausa COLLATE pada ekspresi yang sudah menjadi ekspresi eksplisit. Misalnya, klausa berikut WHERE tidak valid karena COLLATE klausul ditentukan untuk ekspresi yang sudah merupakan ekspresi eksplisit:

    WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_AS

  • Konversi halaman kode untuk jenis data teks tidak diperbolehkan. Anda tidak dapat melemparkan ekspresi teks dari satu kolajek ke kolater lain jika memiliki halaman kode yang berbeda. Operator penugasan tidak dapat menetapkan nilai ketika kolase operand teks kanan memiliki halaman kode yang berbeda dari operand teks kiri.

Prioritas kolase ditentukan setelah konversi jenis data. Operan tempat kolase yang dihasilkan diambil dapat berbeda dari operan yang memasok jenis data hasil akhir. Misalnya, pertimbangkan batch berikut:

CREATE TABLE TestTab  
   (PrimaryKey int PRIMARY KEY,  
    CharCol char(10) COLLATE French_CI_AS  
   )  
  
SELECT *  
FROM TestTab  
WHERE CharCol LIKE N'abc'  

Jenis data Unicode dari ekspresi N'abc' sederhana memiliki prioritas jenis data yang lebih tinggi. Oleh karena itu, ekspresi yang dihasilkan memiliki jenis data Unicode yang ditetapkan ke N'abc'. Namun, ekspresi CharCol memiliki label kolase Implisit, dan N'abc' memiliki label koersi yang lebih rendah dari Coercible-default. Oleh karena itu, kolatasi yang digunakan adalah French_CI_AS kolatasi dari CharCol.

Contoh Aturan Kolajeksi

Contoh berikut menunjukkan cara kerja aturan kolabasi. Untuk menjalankan contoh, buat tabel pengujian berikut.

USE tempdb;  
GO  
  
CREATE TABLE TestTab (  
   id int,   
   GreekCol nvarchar(10) collate greek_ci_as,   
   LatinCol nvarchar(10) collate latin1_general_cs_as  
   )  
INSERT TestTab VALUES (1, N'A', N'a');  
GO  

Konflik dan Kesalahan Kolabasi

Predikat dalam kueri berikut memiliki konflik kolase dan menghasilkan kesalahan.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol;  

Berikut adalah hasil yang ditetapkan.

Msg 448, Level 16, State 9, Line 2  
Cannot resolve collation conflict between 'Latin1_General_CS_AS' and 'Greek_CI_AS' in equal to operation.  

Label Eksplisit vs. Label Implisit

Predikat dalam kueri berikut dievaluasi dalam kolase greek_ci_as karena ekspresi yang tepat memiliki label Eksplisit. Ini lebih diutamakan daripada label Implisit ekspresi kiri.

SELECT *   
FROM TestTab   
WHERE GreekCol = LatinCol COLLATE greek_ci_as;  

Berikut adalah hasil yang ditetapkan.

id          GreekCol             LatinCol  
----------- -------------------- --------------------  
          1 A                    a  
  
(1 row affected)  

Label Tanpa Kolasasi

Ekspresi CASE dalam kueri berikut memiliki label Tanpa kolase; oleh karena itu, ekspresi tidak dapat muncul dalam daftar pilih atau dioperasikan oleh operator yang sensitif terhadap kolase. Namun, ekspresi dapat dioperasikan oleh operator yang tidak peka kolase.

SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)   
FROM TestTab;  

Berikut adalah hasil yang ditetapkan.

Msg 451, Level 16, State 1, Line 1  
Cannot resolve collation conflict for column 1 in SELECT statement.  
SELECT PATINDEX((CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END), 'a')  
FROM TestTab;  

Berikut adalah hasil yang ditetapkan.

Msg 446, Level 16, State 9, Server LEIH2, Line 1  
Cannot resolve collation conflict for patindex operation.  
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END) COLLATE Latin1_General_CI_AS   
FROM TestTab;  

Berikut adalah hasil yang ditetapkan.

--------------------  
a  
  
(1 row affected)  

Kolafasi Sensitif dan Kolaterasi Tidak Sensitif

Operator dan fungsi sensitif kolabasi atau tidak sensitif.

Kolas sensitif
Ini berarti bahwa menentukan operand No-collation adalah kesalahan waktu kompilasi. Hasil ekspresi tidak boleh Tanpa kolase.

Kolabasi tidak peka
Ini berarti bahwa operan dan hasilnya bisa berupa No-collation.

Operator dan Kolajeksi

Operator perbandingan, dan operator MAX, MIN, BETWEEN, LIKE, dan IN, peka kolase. String yang digunakan oleh operator diberi label kolase operand yang memiliki prioritas lebih tinggi. Pernyataan UNION juga sensitif kolase, dan semua operan string dan hasil akhir diberi kolase operand dengan prioritas tertinggi. Kolase diutamakan dari operand UNION dan hasil dievaluasi kolom menurut kolom.

Operator penugasan tidak peka kolase dan ekspresi kanan ditransmisikan ke kolase kiri.

Operator penggalian string peka kolase, dua operan string dan hasilnya diberi label kolase operand dengan kolase tertinggi diutamakan. Pernyataan UNION ALL dan CASE tidak peka kolase, dan semua operan string dan hasil akhir diberi label kolase operand dengan prioritas tertinggi. Kolase diutamakan dari operand UNION ALL dan hasil dievaluasi kolom menurut kolom.

Fungsi dan Kolafasi

Fungsi CAST, CONVERT, dan COLLATE peka kolase untuk jenis data karakter, varchar, dan teks . Jika input dan output fungsi CAST dan CONVERT adalah string karakter, string output memiliki label kolase string input. Jika input bukan string karakter, string output adalah Coercible-default dan menetapkan kolase database saat ini untuk koneksi, atau database yang berisi fungsi yang ditentukan pengguna, prosedur tersimpan, atau pemicu di mana CAST atau CONVERT direferensikan.

Untuk fungsi bawaan yang mengembalikan string tetapi tidak mengambil input string, string hasil adalah Coercible-default dan ditetapkan baik kolase database saat ini, atau kolase database yang berisi fungsi yang ditentukan pengguna, prosedur tersimpan, atau pemicu di mana fungsi direferensikan.

Fungsi berikut peka kolas dan string outputnya memiliki label kolatasi string input:

CHARINDEX

REPLACE

DIFFERENCE

REVERSE

ISNUMERIC

RIGHT

LEFT

SOUNDEX

LEN

STUFF

LOWER

SUBSTRING

PATINDEX

UPPER

Lihat Juga

COLLATE (Transact-SQL)
Konversi Jenis Data (Mesin Database)
Operator (Transact-SQL)
Ekspresi (Transact-SQL)