Hesaplanan sütunlar üzerinde dizin oluşturma

Aşağıdaki gerekler yerine getirildikten sürece, hesaplanan sütunlar üzerinde dizin tanımlayabilirsiniz:

  • Sahiplik gereksinimleri

  • Determinism gereksinimleri

  • Duyarlık gereksinimleri

  • Veri türü gereksinimleri

  • küme seçenek gereksinimleri

Sahiplik gereksinimleri

Içindeki tüm işlev başvuruları hesaplanan sütun tablo olarak aynı sahip olması gerekir.

Determinism gereksinimleri

Her zaman aynı sonucu için küme girdileri dönerseniz deterministic deyimleridir.The IsDeterministic özellik of the COLUMNPROPERTY işlev reports whether a computed_column_expression is deterministic.

  • The computed_column_expression must be deterministic.C computed_column_expression aşağıdakilerden birini veya birkaçını doğruysa deterministic şöyledir:

    • ifade tarafından başvurulan tüm deterministic ve kesin işlevlerdir.Bu işlevler, hem de kullanıcı tanımlı ve yerleşik işlevler içerir.Daha fazla bilgi için bkz:Deterministic ve Nondeterministic işlevler.Işlevleri, hesaplanan sütun KALıCıDıR, imprecise olabilir.Daha fazla bilgi için bkz: Hesaplanan sütunlar üzerinde Kalıcı Dizinler oluşturuluyor bu konunun ilerleyen bölümlerindeki.

    • Içinde başvurulan tüm sütunların ifade hesaplanan sütun içeren tablosundan gelir.

    • Hiçbir sütun başvurusu birden çok satır verilerini çeker.Örneğin, Topla veya ORTALAMA gibi toplamak işlevleri verileri birden çok satır bağlıdır ve yapacağı bir computed_column_expression nondeterministic.

    • Sistem veri erişimi ya da kullanıcı veri erişimi vardır.

  • Ortak dil çalışma zamanı (CLR) ifade içeren herhangi bir hesaplanmış sütunu, sütun dizini önce deterministic ve işaretli PERSISTED olması gerekir.CLR kullanıcı tanımlı tür deyimler içinde hesaplanan sütun tanımları izin verilir.Sütun türü maddelerdeki olduğu sürece CLR kullanıcı tanımlı türü endekslenecek türü olan alan hesaplanır.Daha fazla bilgi için bkz:CLR kullanıcı tanımlı türler.

Not

Tarih veri türü Dize hazır bilgi dizinlenmiş hesaplanmış sütunda bulunan bakın SQL Server, açıkça literal belirli bir tarih biçimi stili kullanarak istediğiniz tarih türü dönüştürmeniz önerilir. Deterministic olan tarih biçimi stili listesi için bkz: CAST ve ÇEVIR.Veritabanı uyumluluk düzey olmadıkça örtülü dönüştürmeye tarih veri türleri, karakter dizeleri içeren ifadeleri nondeterministic, kabul edilen küme 80 veya daha önceki.Bunun nedeni, sonuçlar bağlı Dil and dateformat Sunucu oturum ayarları. Örneğin, deyimin sonuçlarını CONVERT (datetime, '30 listopad 1996', 113) çünkü, DIL ayarına bağlıdır dize '30 listopad 1996' farklı ayların farklı dillerde anlamına gelir. Benzer şekilde, ifade DATEADD(mm,3,'2000-12-01'), Database Engine dize yorumlar. '2000-12-01' DATEFORMAT ayarına dayanır.

Uyumluluk düzey 80 veya daha önce ayarlamadıysanız Unicode karakter verilerinin harmanlamaları arasında örtülü dönüşüm de nondeterministic, kabul edilir.

Veritabanı uyumluluk düzey ayarı 90, dizinler, bu deyimler içeren hesaplanan sütunlarda oluşturamıyor.Ancak, yükseltilen veritabanındaki bu deyimler içeren varolan bir hesaplanan sütunlar maintainable altındadır.Tarih dönüştürmeleri için örtülü olarak dizenin dizini oluşturulmuş hesaplanan sütunlar kullanırsanız, olası dizin bozulması, önlemek için LANGUAGE ve DATEFORMAT ayarları veritabanları ve uygulamaları tutarlı olduğundan emin olun.

Duyarlık gereksinimleri

The computed_column_expression must be precise.C computed_column_expression aşağıdakilerden birini veya birkaçını true olduğunda kesin olur:

  • Bir ifade değil float veya real veri türleri.

  • Bunu kullanmayan bir float veya real veri tanımını yazın. Örneğin aşağıdaki deyim içindeki sütun y olan int ve değil kesin ancak deterministic.

    CREATE TABLE t2 (a int, b int, c int, x float, 
       y AS CASE x 
             WHEN 0 THEN a 
             WHEN 1 THEN b 
             ELSE c 
          END)
    

Not

Tüm float veya real ifade imprecise kabul edilir ve bir anahtar dizin olamaz; bir float veya real ifade, dizinli görünüm, ancak bir anahtar olarak kullanılabilir. Bu hesaplanan sütunlar için de geçerlidir.Herhangi bir işlev, ifade veya kullanıcı tanımlı fonksiyon herhangi içeriyorsa imprecise kabul edilir float veya real ifadeler. Bu mantıksal sürücüler içerir (karşılaştırmaları).

The IsPrecise özellik of the COLUMNPROPERTY işlev reports whether a computed_column_expression is precise.

Veri türü gereksinimleri

  • The computed_column_expression defined for the hesaplanan sütun cannot evaluate to the text, ntext, or image data types.

  • Hesaplanan sütunlar türetilen image, ntext, text, varchar(max), nvarchar(max), varbinary(max), ve xml hesaplanan sütun veri türü dizin anahtar sütunu izin verilen olduğu sürece veri türlerini dizine.

  • Hesaplanan sütunlar türetilen image, ntext, ve text hesaplanan sütun veri türü Anahtar olmayan dizin sütunu olarak izin verilen olduğu sürece, veri türleri kümelenmemiş bir dizin anahtar olmayan (dahil) sütunlarda olabilir.

küme seçenek gereksinimleri

  • ANSI_NULLS bağlantı düzey seçenek olmalıdır küme hesaplanan sütun tanımlayan tablo, CREATE veya ALTER tablo deyim çalıştırıldığında açık.The OBJECTPROPERTY işlev reports whether the option is on through the IsAnsiNullsOn özellik.

  • Dizini oluşturulan bağlantı ve tüm bağlantılarda, dizin içindeki değerleri INSERT, UPDATE veya DELETE deyimleri çalışırken ON olarak ayarlamak, altı küme seçenekleri ve bir seçeneği KAPALı olması gerekir.Üzerinde dizin en iyi duruma getiricisi yok sayıyor bir hesaplanan sütun için aynı bu seçenek ayarları olan bir bağlantı tarafından yürütülen her deyim.

    • NUMERIC_ROUNDABORT seçeneği KAPALı olarak ayarlanmalıdır ve ON aşağıdaki seçenekleri ayarlayın:

    • ansi_nulls

    • ansi_padding

    • ansi_warnings

    • ARITHABORT

    • concat_null_yields_null

    • QUOTED_IDENTIFIER

    küme ting ANSı_WARNıNGS'IÇIN örtülü olarak küme s veritabanı uyumluluk düzey olduğunda açık ARITHABORT ON küme 90.Veritabanı uyumluluk düzey küme ARITHABORT seçeneği açık olarak 80 veya daha önce olmalıdır küme açık.Daha fazla bilgi için bkz:sonuçlar etkiler, küme seçenekleri.

Hesaplanan sütunlar üzerinde Kalıcı Dizinler oluşturuluyor

Üzerinde dizin oluşturma bir hesaplanan sütun PERSISTED tablo, CREATE veya ALTER tablo ifade içinde sütun işaretlenmişse, deterministic ancak imprecise, bir ifade ile tanımlanır.Bunun anlamı Database Engine hesaplanan değerleri depolar tablo ve hesaplanan sütun bağımlı olduğu diğer sütunlara güncelleştirildiği onları güncelleştirir. The Database Engine uses these persisted values when it creates an index on the sütun, and when the index is referenced in a query. Hesaplanmış bir sütunda dizin oluşturmak bu seçeneği sağlar, Database Engine doğrulukla döndüren bir işlev sütun ifadeler, özellikle de oluşturulan bir CLR işlevi hesaplanmış olup olmadığını kanıtlamak edemiyor .NET Framework, deterministic ve kesin.