Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'teki SQL analiz uç noktası
Microsoft Fabric'teki ambar
Microsoft Fabric'teki SQL veritabanı
Harmanlama zorlama kuralları olarak da bilinen harmanlama önceliği, aşağıdaki iki sonucu belirler:
Bir karakter dizesi olarak değerlendirilen bir ifadenin nihai sonucunun harmanlanması.
Karakter dizesi girişleri kullanan ancak ve IN gibi
LIKEbir karakter dizesi döndürmeyen harmanlama duyarlı işleçler tarafından kullanılan harmanlama.
Harmanlama önceliği kuralları yalnızca karakter dizesi veri türleri için geçerlidir: char, varchar, text, nchar, nvarchar ve ntext. Diğer veri türlerine sahip nesneler harmanlama değerlendirmelerine katılmaz.
Harmanlama etiketleri
Aşağıdaki tabloda, tüm nesnelerin harmanlamalarının tanımlandığı dört kategori listelenmiş ve açıklanmıştır. Her kategorinin adı harmanlama etiketidir.
| Harmanlama etiketi | Nesne türleri |
|---|---|
Coercible-default |
Herhangi bir Transact-SQL karakter dizesi değişkeni, parametresi, değişmez değeri veya katalog yerleşik işlevinin çıkışı ya da dize girişi almayan ancak bir dize çıkışı üreten yerleşik bir işlev. Nesne kullanıcı tanımlı bir işlevde, saklı yordamda veya tetikleyicide bildirilirse, nesneye işlevin, saklı yordamın veya tetikleyicinin oluşturulduğu veritabanının varsayılan harmanlaması atanır. Nesne bir toplu işte bildirilirse, nesneye bağlantı için geçerli veritabanının varsayılan harmanlaması atanır. |
Implicit X |
Sütun başvurusu. İfadenin harmanlaması (X), tablo veya görünümdeki sütun için tanımlanan harmanlamadan alınır. Sütuna açıkça veya COLLATE deyiminde CREATE TABLE bir yan tümce kullanılarak harmanlama CREATE VIEW atanmış olsa bile, sütun başvurusu örtük olarak sınıflandırılır. |
Explicit X |
İfadede bir yan tümcesi kullanılarak belirli bir harmanlama (X) için açıkça yayınlanmış bir COLLATE ifade. |
No-collation |
bir ifadenin değerinin örtük harmanlama etiketinin çakışan harmanlamalarına sahip iki dize arasındaki işlemin sonucu olduğunu gösterir. İfade sonucu harmanlama olmaması olarak tanımlanır. |
Harmanlama kuralları
Yalnızca bir karakter dizesi nesnesine başvuran basit bir ifadenin harmanlama etiketi, başvuruda bulunan nesnenin harmanlama etiketidir.
Aynı harmanlama etiketine sahip iki işlenen ifadeye başvuran karmaşık bir ifadenin harmanlama etiketi, işlenen ifadelerinin harmanlama etiketidir.
Farklı harmanlamalara sahip iki işlenen ifadeye başvuran karmaşık bir ifadenin nihai sonucunun harmanlama etiketi aşağıdaki kuralları temel alır:
Açık, örtük yerine önceliklidir. Örtük, Coercible-default'den önceliklidir:
Açık > Örtük > Coercible-default
Farklı harmanlamalar atanmış iki Açık ifadenin birleştirilmesi hata oluşturur:
Açık X + Açık Y = Hata
Farklı harmanlamalara sahip iki Örtük ifadenin birleştirilmesi, Harmanlama yok sonucunu verir:
Örtük X + Örtük Y = Harmanlama Yok
Bir ifadeyi No-collation ile herhangi bir etiketin ifadesiyle birleştirerek (aşağıdaki kurala bakın), Harmanlama yok etiketine sahip bir sonuç verir:
Harmanlama yok + herhangi bir şey = Harmanlama yok
Bir ifadeyi No harmanlaması ile Açık harmanlama içeren bir ifadeyle birleştirmek, Açık etiketli bir ifade verir:
Harmanlama yok + Açık X = Açık
Aşağıdaki tabloda kurallar özetlemektedir.
| İşlenen zorlama etiketi | Açık X | Örtük X | Coercible-default | Harmanlama yok |
|---|---|---|---|---|
Explicit Y |
Hata Oluşturur | Sonuç Açık Y | Sonuç Açık Y | Sonuç Açık Y |
Implicit Y |
Sonuç Açık X | Sonuç Harmanlama Değil | Sonuç Örtük Y | Sonuç Harmanlama Değil |
Coercible-default |
Sonuç Açık X | Sonuç Örtük X | Sonuç, Coercible-default | Sonuç Harmanlama Değil |
No-collation |
Sonuç Açık X | Sonuç Harmanlama Değil | Sonuç Harmanlama Değil | Sonuç Harmanlama Değil |
Aşağıdaki ek kurallar harmanlama önceliği için de geçerlidir:
Zaten açık bir ifade olan bir ifadede birden çok
COLLATEyan tümceniz olamaz. Örneğin, zaten açık bir ifade olan bir ifade için birWHEREyan tümce belirtildiğinden aşağıdakiCOLLATEyan tümce geçerli değildir:WHERE ColumnA = ( 'abc' COLLATE French_CI_AS) COLLATE French_CS_ASMetin veri türleri için kod sayfası dönüştürmelerine izin verilmez. Farklı kod sayfaları varsa bir metin ifadesini bir harmanlamadan diğerine dönüştüremezsiniz. Sağ metin işleneninin harmanlaması, sol metin işleneninden farklı bir kod sayfasına sahip olduğunda atama işleci değerleri atayamaz.
Harmanlama önceliği, veri türü dönüştürme işleminden sonra belirlenir. Elde edilen harmanlamanın alındığı işlenen, nihai sonucun veri türünü sağlayan işlenenden farklı olabilir. Örneğin, aşağıdaki toplu işlemi göz önünde bulundurun:
CREATE TABLE TestTab
(
PrimaryKey INT PRIMARY KEY,
CharCol CHAR (10) COLLATE French_CI_AS
);
SELECT *
FROM TestTab
WHERE CharCol LIKE N'abc';
Uyarı
nvarchar veri türü Doku Ambarı'nda desteklenmez, ancak bu makaledeki örneklerin çoğu UTF-8 ve nvarchar kullanan varchar için geçerlidir ve aksi belirtilmedikçe Doku Ambarı için geçerli olmaya devam etmektedir.
Basit ifadenin N'abc' Unicode veri türü daha yüksek veri türü önceliğine sahiptir. Bu nedenle, sonuçta elde edilen ifadeye Atanmış N'abc'Unicode veri türü vardır. Ancak ifade CharCol örtük harmanlama etiketine ve N'abc' Coercible-default daha düşük bir zorlama etiketine sahiptir. Bu nedenle, kullanılan harmanlama, harmanlamadır French_CI_ASCharCol.
Harmanlama kuralları örnekleri
Aşağıdaki örneklerde harmanlama kurallarının nasıl çalıştığı gösterilmektedir. Örnekleri çalıştırmak için aşağıdaki test tablosunu oluşturun.
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
Harmanlama çakışması ve hatası
Aşağıdaki sorgudaki koşul harmanlama çakışması içeriyor ve bir hata oluşturuyor.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol;
Sonuç kümesi aşağıdadır.
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.
Açık etiket ve örtük etiket karşılaştırması
Doğru ifadede Açık etiket olduğundan aşağıdaki sorgudaki koşul harmanlama greek_ci_as olarak değerlendirilir. Bu, sol ifadenin Örtük etiketinden önceliklidir.
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as;
Sonuç kümesi aşağıdadır.
id GreekCol LatinCol
----------- -------------------- --------------------
1 A a
Harmanlama etiketleri yok
Uyarı
UTF-8 harmanlamasında nvarchar ve varchar davranışları arasındaki fark nedeniyle, bu örnek Doku Ambarı'nda geçerli değildir.
CASE Aşağıdaki sorgulardaki ifadelerin Harmanlama yok etiketi vardır; bu nedenle, bunlar seçim listesinde görünmez veya harmanlama duyarlı işleçler tarafından çalıştırılamaz. Ancak ifadeler harmanlama duyarsız işleçler tarafından çalıştırılabilir.
SELECT (CASE WHEN id > 10 THEN GreekCol ELSE LatinCol END)
FROM TestTab;
Sonuç kümesi aşağıdadır.
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;
Sonuç kümesi aşağıdadır.
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;
Sonuç kümesi aşağıdadır.
--------------------
a
Harmanlama duyarlı ve harmanlama duyarsız
İşleçler ve işlevler harmanlama duyarlı veya duyarsızdır.
- Harmanlama duyarlı: Bu, Harmanlama yok işleneni belirtmenin derleme zamanı hatası olduğu anlamına gelir. İfade sonucu Harmanlama yok olamaz.
- Harmanlama duyarsız: Bu, işlenenlerin ve sonucun Harmanlama yok olabileceği anlamına gelir.
İşleçler ve harmanlama
Karşılaştırma işleçleri ve MAX, MIN, BETWEEN, LIKEve IN işleçleri harmanlama duyarlıdır. İşleçler tarafından kullanılan dizeye, daha yüksek önceliğe sahip işlenenin harmanlama etiketi atanır. deyimi UNION de harmanlama duyarlıdır ve tüm dize işlenenleri ve son sonuç en yüksek önceliğe sahip işlenenin harmanlaması atanır. İşlenenin ve sonucun UNION harmanlama önceliği sütuna göre değerlendirilir.
Atama işleci harmanlama duyarsız ve sağ ifade sol harmanlama için yayınlanır.
Dize birleştirme işleci harmanlama duyarlıdır, iki dize işleneni ve sonucuna en yüksek harmanlama önceliğine sahip işlenenin harmanlama etiketi atanır.
UNION ALL ve CASE deyimleri harmanlama duyarsızdır ve tüm dize işlenenleri ve son sonuçlara en yüksek önceliğe sahip işlenenin harmanlama etiketi atanır. İşlenenlerin ve sonucun UNION ALL harmanlama önceliği sütuna göre değerlendirilir.
İşlevler ve harmanlama
CAST, CONVERTve COLLATE işlevleri karakter, varchar ve metin veri türleri için harmanlama duyarlıdır. ve CAST işlevlerinin CONVERT girişi ve çıkışı karakter dizeleriyse, çıkış dizesi giriş dizesinin harmanlama etiketine sahiptir. Giriş bir karakter dizesi değilse, çıkış dizesi Coercible-default'dır ve bağlantı için geçerli veritabanının harmanlaması ya da kullanıcı tanımlı işlevi, saklı yordamı veya veya öğesine başvurulan tetikleyiciyi CASTCONVERT içeren veritabanına atanır.
Bir dize döndüren ancak dize girişi almayan yerleşik işlevler için sonuç dizesi Coercible-default şeklindedir. Sonuç dizesine geçerli veritabanının harmanlaması veya kullanıcı tanımlı işlevi, saklı yordamı veya işleve başvurulan tetikleyiciyi içeren veritabanının harmanlaması atanır.
Aşağıdaki işlevler harmanlama duyarlıdır ve çıkış dizeleri giriş dizesinin harmanlama etiketine sahiptir:
CHARINDEXDIFFERENCEISNUMERICLEFTLENLOWERPATINDEXREPLACEREVERSERIGHTSOUNDEXSTUFFSUBSTRINGUPPER