Aracılığıyla paylaş


Harmanlama önceliği

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft 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 LIKE bir 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 COLLATE yan tümceniz olamaz. Örneğin, zaten açık bir ifade olan bir ifade için bir WHERE yan tümce belirtildiğinden aşağıdaki COLLATE yan tümce geçerli değildir:

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

  • Metin 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:

  • CHARINDEX
  • DIFFERENCE
  • ISNUMERIC
  • LEFT
  • LEN
  • LOWER
  • PATINDEX
  • REPLACE
  • REVERSE
  • RIGHT
  • SOUNDEX
  • STUFF
  • SUBSTRING
  • UPPER