Prioritas kolase
Berlaku untuk: Titik akhir analitik SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) SQL di Microsoft Fabric Warehouse 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 karenaCOLLATE
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 set hasilnya.
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 set hasilnya.
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 set hasilnya.
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 set hasilnya.
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 set hasilnya.
--------------------
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 MAX
operator , , MIN
BETWEEN
, 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