Prioritas kolase

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 prioritas, juga dikenal sebagai aturan pemaksaan kolase, menentukan dua hasil 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.
Implicit X 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 COLLATE klausa dalam CREATE TABLE pernyataan atau CREATE VIEW , referensi kolom diklasifikasikan sebagai implisit.
Explicit X Ekspresi yang secara eksplisit ditransmisikan ke kolate tertentu (X) dengan menggunakan klausa COLLATE dalam ekspresi.
No-collation 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 kolabasi

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
Explicit Y Menghasilkan Kesalahan Hasilnya adalah Eksplisit Y Hasilnya adalah Eksplisit Y Hasilnya adalah Eksplisit Y
Implicit 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
No-collation 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'  

Catatan

Jenis data nvarchar tidak didukung di Fabric Warehouse, tetapi sebagian besar contoh dalam artikel ini berlaku untuk varchar menggunakan UTF-8 dan nvarchar, sehingga tetap berlaku untuk Fabric Warehouse kecuali dinyatakan lain.

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 kolabasi

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 kolaksi

Catatan

Karena perbedaan antara perilaku nvarchar dan varchar dalam kolab UTF-8, contoh ini tidak berlaku di Fabric Warehouse.

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)  

Kolater sensitif dan kolaterasi tidak sensitif

Operator dan fungsi sensitif kolabasi atau tidak sensitif.

  • Sensitif kolabasi: Ini berarti bahwa menentukan operand Tanpa kolalasi adalah kesalahan waktu kompilasi. Hasil ekspresi tidak boleh Tanpa kolase.
  • Kolase tidak sensitif: Ini berarti bahwa operan dan hasilnya bisa menjadi Tanpa kolase.

Operator dan kolatasi

Operator perbandingan, dan MAXoperator , , MINBETWEEN, LIKE, dan IN , sensitif kolate. String yang digunakan oleh operator diberi label kolase operand yang memiliki prioritas lebih tinggi. Pernyataan UNION ini juga sensitif kolase, dan semua operan string dan hasil akhir diberi kolase operand dengan prioritas tertinggi. Kolase yang diutamakan dari UNION operand 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 UNION ALL operand dan hasil dievaluasi kolom menurut kolom.

Fungsi dan kolatasi

Fungsi CAST, CONVERT, dan COLLATE sensitif kolabasi untuk jenis data karakter, varchar, dan teks . Jika input dan output fungsi CAST dan CONVERT adalah string karakter, string output memiliki label kolater 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 hasilnya adalah Coercible-default. String hasil 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