Bir SQLCLR UDT kullanın. Bu, işe yarayabilir, ancak yukarıda açıklanan yaklaşıma kıyasla net bir kazanç sağlayıp sağlamadığı belirsizdir.
Evet, bir SQLCLR UDT karşılaştırma işleçlerini özel algoritmalarla geçersiz kılabilir. Bu, değerin zaten aynı özel türden başka bir değerle veya örtük olarak dönüştürülmesi gereken bir değerle karşılaştırıldığı durumları işler. Bu , aralık filtresini bir koşulda ele almalıdırWHERE
.
UDT'yi normal bir sütun türü (hesaplanmış bir sütun değil) olarak sıralamakla ilgili olarak, bu yalnızca UDT "bayt sıralıysa" mümkündür. "Bayt sıralı" olmak, UDT'nin (UDT'de tanımlanabilen) ikili temsilinin doğal olarak uygun sırayla sıralandığı anlamına gelir. İkili sunumun, dolgulu, sabit uzunluklu bölümleri olan VARCHAR (50) sütunu için yukarıda açıklanan yaklaşıma benzer şekilde ele alındığı kabul edilir. Veya, ikili gösterimin doğal olarak doğru şekilde sipariş edilmesini sağlamak kolay olmasaydı, UDT'nin düzgün bir şekilde sipariş edilecek bir değer çıkaran bir yöntem veya özelliğini açığa çıkarabilir ve daha sonra PERSISTED
bunun üzerinde bir hesaplanmış sütun oluşturabilirsiniz . yöntem veya özellik. Yöntemin deterministik olması ve olarak işaretlenmesi gerekir IsDeterministic = true
.
Bu yaklaşımın faydaları:
- "Orijinal değer" alanına gerek yoktur.
- Verileri eklemek veya değerleri karşılaştırmak için bir UDF çağırmanıza gerek yoktur.
Parse
UDT yönteminin P7B18
değeri aldığını ve dönüştürdüğünü varsayarsak , değerleri doğal olarak olduğu gibi girebilmeniz gerekir P7B18
. Ve UDT'de ayarlanan örtük dönüştürme yöntemi ile, WHERE koşulu da sadece P7B18` kullanılmasına izin verecektir.
Bu yaklaşımın sonuçları:
- Sütun veri türü olarak bayt sıralı UDT kullanılıyorsa, yalnızca alanın seçilmesi ikili temsili döndürür. Veya
PERSISTED
UDT'nin bir özelliği veya yönteminde hesaplanmış bir sütun kullanıyorsanız , özellik veya yöntem tarafından döndürülen temsili alırsınız. Orijinal P7B18
değeri istiyorsanız, bu temsili döndürmek için kodlanmış UDT'nin bir yöntemini veya özelliğini çağırmanız gerekir. ToString
Yine de yöntemi geçersiz kılmanız gerektiğinden, bunu sağlamak için iyi bir adaydır.
İkili gösterimde herhangi bir değişiklik yapmanın ne kadar kolay / zor olacağı belli değil (en azından şu anda bana göre bu kısmı test etmedim). Depolanmış, sıralanabilir temsili değiştirmek, alanın bırakılmasını ve yeniden eklenmesini gerektirebilir. Ayrıca, her iki şekilde de kullanıldığında, UDT içeren Meclisin düşürülmesi başarısız olur, bu nedenle Meclis'te bu UDT'nin dışında başka bir şey olmadığından emin olmak istersiniz. Sen olabilir ALTER ASSEMBLY
tanımını değiştirmek için, ancak bu konuda bazı kısıtlamalar vardır.
Öte yandan, VARCHAR()
alan algoritmanın bağlantısı kesilmiş verilerdir, bu nedenle yalnızca sütunun güncellenmesi gerekir. Ve on milyonlarca satır (veya daha fazla) varsa, bu toplu bir yaklaşımla yapılabilir.
Bu alfasayısal sınıflandırmayı gerçekten sağlayan ICU kitaplığını uygulayın . Oldukça işlevsel olsa da, kütüphane sadece iki dilde gelir: C / C ++ ve Java. Bu, Visual C ++ ile çalışması için bazı ince ayarlar yapmanız gerekebileceği veya Java kodunun IKVM kullanılarak MSIL'e dönüştürülebilme şansı olmadığı anlamına gelir . Sitede yönetilen kodda erişilebilen bir COM arabirimi sağlayan bir veya iki .NET tarafı projesi var, ancak bir süredir güncellenmediğine ve bunları denemediğime inanıyorum. Buradaki en iyi bahis, sıralama anahtarları oluşturmak amacıyla bunu uygulama katmanında ele almak olacaktır. Daha sonra sıralama anahtarları yeni bir sıralama sütununa kaydedilir.
Bu en pratik yaklaşım olmayabilir. Bununla birlikte, böyle bir yeteneğin var olması hala çok havalı. Aşağıdaki yanıtta bunun bir örneğini daha ayrıntılı olarak açıkladım:
Aşağıdaki dizeleri 1,2,3,6,10,10A, 10B, 11 sırasıyla sıralamak için bir karşılaştırma var mı?
Ancak bu soruda ele alınan kalıp biraz daha basittir. Bu Soruda ele alınan desen türünün de işe yaradığını gösteren bir örnek için lütfen aşağıdaki sayfaya gidin:
YBÜ Harmanlama Demosu
"Ayarlar" altında, "sayısal" seçeneğini "açık" olarak ayarlayın ve diğerlerinin tümü "varsayılan" olarak ayarlanmalıdır. Ardından, "sıralama" düğmesinin sağında "fark güçlü yönleri" seçeneğinin işaretini kaldırın ve "sıralama anahtarları" seçeneğini işaretleyin. Ardından, "Giriş" metin alanındaki öğelerin listesini aşağıdaki listeyle değiştirin:
P12B22
P7B18
P12B3
as456456hgjg6786867
P7Bb19
P7BA19
P7BB19
P007B18
P7Bb20
P7Bb19z23
"Sırala" düğmesini tıklayın. "Çıktı" metin alanı aşağıdakileri görüntülemelidir:
as456456hgjg6786867
29 4D 0F 7A EA C8 37 35 3B 35 0F 84 17 A7 0F 93 90 , 0D , , 0D .
P7B18
47 0F 09 2B 0F 14 , 08 , FD F1 , DC C5 DC 05 .
P007B18
47 0F 09 2B 0F 14 , 08 , FD F1 , DC C5 DC 05 .
P7BA19
47 0F 09 2B 29 0F 15 , 09 , FD FF 10 , DC C5 DC DC 05 .
P7Bb19
47 0F 09 2B 2B 0F 15 , 09 , FD F2 , DC C5 DC 06 .
P7BB19
47 0F 09 2B 2B 0F 15 , 09 , FD FF 10 , DC C5 DC DC 05 .
P7Bb19z23
47 0F 09 2B 2B 0F 15 5B 0F 19 , 0B , FD F4 , DC C5 DC 08 .
P7Bb20
47 0F 09 2B 2B 0F 16 , 09 , FD F2 , DC C5 DC 06 .
P12B3
47 0F 0E 2B 0F 05 , 08 , FD F1 , DC C5 DC 05 .
P12B22
47 0F 0E 2B 0F 18 , 08 , FD F1 , DC C5 DC 05 .
Sıralama anahtarlarının virgülle ayrılmış birden çok alanda yapı olduğunu lütfen unutmayın. Her alanın bağımsız olarak sıralanması gerekir, böylece SQL Server'da uygulanması gerekiyorsa çözülmesi gereken başka bir küçük sorun ortaya çıkar.
P7B12
olabilirP 07 B 12
(ASCII aracılığıyla)80 07 65 12
, yani80076512