Aracılığıyla paylaş


Kullanıcı tanımlı tür (UDT) gereksinimleri

Şunlar için geçerlidir: SQL Server

SQL Server'a yüklenecek kullanıcı tanımlı bir tür (UDT) oluştururken birkaç önemli tasarım kararı vermelisiniz. Çoğu UDT için yapı olarak UDT oluşturulması önerilir, ancak bunu sınıf olarak oluşturmak da bir seçenektir. UDT tanımının SQL Server'a kaydedilebilmesi için UDT oluşturma belirtimlerine uyması gerekir.

UDF'leri uygulama gereksinimleri

SQL Server'da çalıştırmak için UDT'nizin UDT tanımında aşağıdaki gereksinimleri uygulaması gerekir:

UDT, Microsoft.SqlServer.Server.SqlUserDefinedTypeAttributebelirtmelidir. System.SerializableAttribute kullanımı isteğe bağlıdır ancak önerilir.

  • UDT, bir genel static (Visual Basic'teShared) Null yöntemi oluşturarak sınıf veya yapıda System.Data.SqlTypes.INullable arabirimini uygulamalıdır. SQL Server varsayılan olarak null değerini algılar. Bu, UDT'de yürütülen kodun null değeri tanıyabilmesi için gereklidir.

  • UDT, ayrıştırma işlemini destekleyen bir genel static (veya Shared) Parse yöntemi ve nesnenin dize gösterimine dönüştürmek için genel bir ToString yöntemi içermelidir.

  • Kullanıcı tanımlı serileştirme biçimine sahip bir UDT, System.Data.IBinarySerialize arabirimini uygulamalı ve bir Read ve Write yöntemi sağlamalıdır.

  • UDT System.Xml.Serialization.IXmlSerializableuygulamalıdır veya standart serileştirmenin geçersiz kılınması gerekiyorsa tüm ortak alanlar ve özellikler XML serileştirilebilir veya XmlIgnore özniteliğiyle süslenmiş türlerden olmalıdır.

  • Bir UDT nesnesinin yalnızca bir serileştirmesi olmalıdır. Serileştirme veya seri durumdan çıkarma yordamları belirli bir nesnenin birden fazla gösterimini algılarsa doğrulama başarısız olur.

  • verileri bayt sırasına göre karşılaştırmak için SqlUserDefinedTypeAttribute.IsByteOrderedtrue olmalıdır. IComparable arabirimi uygulanmamışsa ve SqlUserDefinedTypeAttribute.IsByteOrderedfalseise bayt sırası karşılaştırmaları başarısız olur.

  • Bir sınıfta tanımlanan UDT'nin bağımsız değişken içermeyen bir ortak oluşturucuya sahip olması gerekir. İsteğe bağlı olarak daha fazla aşırı yüklenmiş sınıf oluşturucu oluşturabilirsiniz.

  • UDT, veri öğelerini genel alanlar veya özellik yordamları olarak kullanıma sunmalıdır.

  • Ortak adlar 128 karakterden uzun olamaz veVeritabanı tanımlayıcılarında tanımlanan tanımlayıcılar için SQL Server adlandırma kurallarına uygun olmalıdır.

  • sql_variant sütunlar UDT örnekleri içeremez.

  • SQL Server tür sistemi UDT'ler arasındaki devralma hiyerarşisinin farkında olmadığından devralınan üyelere Transact-SQL erişilemez. Ancak, sınıflarınızı yapılandırırken devralmayı kullanabilir ve türün yönetilen kod uygulamasında bu tür yöntemleri çağırabilirsiniz.

  • Sınıf oluşturucu dışında üyeler aşırı yüklenemez. Aşırı yüklenmiş bir yöntem oluşturursanız, derlemeyi kaydederken veya türü SQL Server'da oluştururken hata oluşmaz. Aşırı yüklenmiş yöntemin algılanması, tür oluşturulduğunda değil çalışma zamanında gerçekleşir. Aşırı yüklenmiş yöntemler, hiçbir zaman çağrılmadıkları sürece sınıfında bulunabilir. Aşırı yüklenmiş yöntemi çağırdığınızda bir hata oluşur.

  • Tüm static (veya Shared) üyeleri sabit veya salt okunur olarak bildirilmelidir. Statik üyeler değiştirilebilir olamaz.

  • SqlUserDefinedTypeAttribute.MaxByteSize alanı -1olarak ayarlanırsa, serileştirilmiş UDT büyük nesne (LOB) boyut sınırı (şu anda 2 GB) kadar büyük olabilir. UDT'nin boyutu MaxByteSized alanında belirtilen değeri aşamaz.

Not

Karşılaştırmaları gerçekleştirmek için sunucu tarafından kullanılmasa da, isteğe bağlı olarak CompareTotek bir yöntemi kullanıma sunan System.IComparable arabirimini uygulayabilirsiniz. Bu, istemci tarafında UDT değerlerinin doğru bir şekilde karşılaştırılması veya sıralanması istenen durumlarda kullanılır.

Yerel serileştirme

UDT'niz için doğru serileştirme özniteliklerini seçmek, oluşturmaya çalıştığınız UDT türüne bağlıdır. Native serileştirme biçimi, SQL Server'ın diskte UDT'nin verimli bir yerel gösterimini depolamasını sağlayan basit bir yapı kullanır. UDT basitse ve yalnızca aşağıdaki türlerdeki alanları içeriyorsa Native biçimi önerilir:

bool, bayt, bayt, kısa, ushort, int, uint, uzun, ulong, float, çift, , , , , , , , ,

Bu türlerin alanlarından oluşan değer türleri, C# dilinde struct veya Visual Basic .NET'te bilinen Structure gibi Native biçimi için iyi adaylardır. Örneğin, Native serileştirme biçimiyle belirtilen bir UDT, Native biçimiyle de belirtilen başka bir UDT'nin alanını içerebilir. UDT tanımı daha karmaşıksa ve önceki listede bulunmayan veri türleri içeriyorsa, bunun yerine UserDefined serileştirme biçimini belirtmeniz gerekir.

Native biçimi aşağıdaki gereksinimlere sahiptir:

  • türü Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSizeiçin bir değer belirtmemelidir.

  • Tüm alanlar serileştirilebilir olmalıdır.

  • UDT bir yapıda değil de bir sınıfta tanımlanıyorsa System.Runtime.InteropServices.StructLayoutAttributeStructLayout.LayoutKindSequential olarak belirtilmelidir. Bu öznitelik, veri alanlarının fiziksel düzenini denetler ve üyeleri göründükleri sırayla yerleştirilmeye zorlamak için kullanılır. SQL Server, birden çok değere sahip UDF'lerin alan sırasını belirlemek için bu özniteliği kullanır.

serileştirme ile tanımlanan bir UDT örneği için, ADO.NETile kullanıcı tanımlı türler oluşturma UDT bölümüne bakın.

UserDefined serileştirme

Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute özniteliğinin UserDefined biçimi ayarı, geliştiriciye ikili biçim üzerinde tam denetim sağlar. Format özniteliği özelliğini UserDefinedolarak belirtirken, kodunuzda aşağıdaki eylemleri gerçekleştirmeniz gerekir:

  • İsteğe bağlı IsByteOrdered özniteliği özelliğini belirtin. Varsayılan değer false.

  • Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute MaxByteSize özelliğini belirtin.

  • System.Data.Sql.IBinarySerialize arabirimini uygulayarak UDT için Read ve Write yöntemlerini uygulamak için kod yazın.

serileştirme ile tanımlanan bir UDT örneği için, ADO.NETile kullanıcı tanımlı türler oluşturma içindeki Para Birimi UDT'sine bakın.

Not

UDT alanlarının dizine alınabilmesi için yerel serileştirme kullanması veya kalıcı olması gerekir.

Serileştirme öznitelikleri

Öznitelikler, UDT'lerin depolama gösterimini oluşturmak ve UDT'leri değere göre istemciye iletmek için serileştirmenin nasıl kullanıldığını belirler. UDT'yi oluştururken Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute belirtmeniz gerekir. Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute özniteliği, sınıfın bir UDT olduğunu gösterir ve UDT için depolama alanını belirtir. İsteğe bağlı olarak Serializable özniteliğini belirtebilirsiniz, ancak SQL Server bunu gerektirmez.

Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute aşağıdaki özelliklere sahiptir.

Biçim

UDT'nin veri türlerine bağlı olarak Native veya UserDefinedolabilecek serileştirme biçimini belirtir.

IsByteOrdered

SQL Server'ın UDT üzerinde ikili karşılaştırmaları nasıl gerçekleştirdiğini belirleyen Boolean değeri.

IsFixedLength

Bu UDT'nin tüm örneklerinin aynı uzunlukta olup olmadığını gösterir.

MaxByteSize

Bayt cinsinden en büyük örnek boyutu. UserDefined serileştirme biçimine sahip MaxByteSize belirtmeniz gerekir. Kullanıcı tanımlı serileştirme belirtilen bir UDT için MaxByteSize, UDT'nin kullanıcı tarafından tanımlandığı şekilde serileştirilmiş biçimindeki toplam boyutuna başvurur. MaxByteSize değeri, 18000aralığında olmalı veya UDT'nin 8.000 bayttan büyük olduğunu belirtmek için -1 olarak ayarlanmalıdır (toplam boyut en büyük LOB boyutunu aşamaz). 10 karakterlik bir dize (System.Char) özelliğine sahip bir UDT düşünün. UDT bir BinaryWriter kullanılarak seri hale getirildiğinde, seri hale getirilmiş dizenin toplam boyutu 22 bayttır: Unicode UTF-16 karakteri başına 2 bayt, maksimum karakter sayısıyla çarpılır ve ikili akışın seri hale getirilmesinden kaynaklanan 2 denetim bayt yükü. Bu nedenle, MaxByteSizedeğerini belirlerken, seri hale getirilmiş UDT'nin toplam boyutu dikkate alınmalıdır: ikili biçimde serileştirilmiş verilerin boyutu ve serileştirmenin neden olduğu ek yük.

ValidationMethodName

UDT örneklerini doğrulamak için kullanılan yöntemin adı.

Isbyteordered'ı ayarlama

Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered özelliği trueolarak ayarlandığında, serileştirilmiş ikili verilerin bilgilerin anlamsal sıralaması için kullanılabileceğini garanti edebilirsiniz. Bu nedenle, bayt sıralı UDT nesnesinin her örneğinin yalnızca bir serileştirilmiş gösterimi olabilir. SQL Server'da serileştirilmiş baytlar üzerinde bir karşılaştırma işlemi gerçekleştirildiğinde, sonuçları yönetilen kodda aynı karşılaştırma işlemi gerçekleşmiş gibi olmalıdır. IsByteOrdered trueolarak ayarlandığında aşağıdaki özellikler de desteklenir:

  • Bu türdeki sütunlarda dizin oluşturma özelliği.

  • Bu türdeki sütunlarda birincil ve yabancı anahtarların yanı sıra CHECK ve UNIQUE kısıtlamaları oluşturma olanağı.

  • Transact-SQL ORDER BY, GROUP BYve PARTITION BY yan tümcelerini kullanabilme. Bu durumlarda, sıralamayı belirlemek için türün ikili gösterimi kullanılır.

  • Transact-SQL deyimlerinde karşılaştırma işleçlerini kullanma olanağı.

  • Bu türdeki hesaplanan sütunları kalıcı hale getirmek.

IsByteOrdered trueolarak ayarlandığında hem Native hem de UserDefined serileştirme biçimleri aşağıdaki karşılaştırma işleçlerini destekler:

  • Eşittir (=)
  • Eşit değil (!=)
  • Büyüktür (>)
  • Küçüktür (<)
  • Büyüktür veya eşittir (>=)
  • Küçük veya eşittir (<=)

Null atanabilirlik uygulama

Derlemeleriniz için öznitelikleri doğru belirtmeye ek olarak, sınıfınızın null atanabilirliği de desteklemesi gerekir. SQL Server'a yüklenen UDF'ler null algılamalıdır, ancak UDT'nin null değeri tanıması için sınıfın INullable arabirimini uygulaması gerekir. Daha fazla bilgi ve UDT'de null atanabilirlik uygulama örneği için bkz. ADO.NETile kullanıcı tanımlı türler oluşturma .

Dize dönüştürmeleri

UDT'ye ve UDT'den dize dönüştürmeyi desteklemek için sınıfınızda bir Parse yöntemi ve ToString yöntemi sağlamanız gerekir. Parse yöntemi bir dizenin UDT'ye dönüştürülmesini sağlar. static (veya Visual Basic'te Shared) olarak bildirilmeli ve System.Data.SqlTypes.SqlStringtüründe bir parametre almalıdır. daha fazla bilgi ve ve yöntemlerini uygulama örneği için bkz. ADO.NETile kullanıcı tanımlı türler oluşturma .

XML serileştirme

UDF'ler XML serileştirme sözleşmesine uygun olarak xml veri türüne dönüştürmeyi desteklemelidir. System.Xml.Serialization ad alanı, nesneleri XML biçiminde belgeler veya akışlar halinde serileştirmek için kullanılan sınıfları içerir. XML serileştirme ve seri durumdan çıkarma için özel biçimlendirme sağlayan IXmlSerializable arabirimini kullanarak xml serileştirme uygulamayı seçebilirsiniz.

XMLUDT'den xmlaçık dönüştürmeler gerçekleştirmeye ek olarak, XML serileştirme şunları yapmanıza olanak tanır:

  • xml veri türüne dönüştürüldikten sonra UDT örneklerinin değerleri üzerinde XQuery kullanın.

  • SQL Server'da Yerel XML Web Hizmetleri ile parametreli sorgularda ve Web yöntemlerinde UDT'leri kullanın.

  • XML verilerinin toplu yükünü almak için UDF'leri kullanın.

  • UDT sütunları içeren tablolar içeren DataSet'leri seri hale getirme.

UDF'ler FOR XML sorgularında serileştirilmemiştir. UDF'lerin XML serileştirmesini görüntüleyen bir FOR XML sorgusu yürütmek için, her UDT sütununu açıkça SELECT deyimindeki xml veri türüne dönüştürün. Ayrıca sütunları açıkça varbinary, varcharveya nvarchardönüştürebilirsiniz.