Başka bir seçenek de bunu SQLCLR ile ele almaktır. .NET'te zaten bunu yapan bir yöntem bile vardır: TextInfo.ToTitleCase (in System.Globalization
). Bu yöntem, her sözcüğün ilk harfini Büyük Harf ve kalan harfleri Küçük Harfe dönüştürür. Buradaki diğer tekliflerden farklı olarak, tümüyle büyük harf olan sözcükleri de atlayarak kısaltma olduklarını varsayar. Tabii ki, bu davranış istenirse, bunu yapmak için T-SQL önerilerinden herhangi birini güncellemek yeterince kolay olacaktır.
.NET yönteminin bir yararı, Tamamlayıcı Karakterler olan Büyük Harfler yapabilmesidir. Örneğin: DESERET SMALL LETTER OW , DESERET CAPITAL LETTER OW'un büyük harfli eşlemesine sahiptir (her ikisi de buraya yapıştırdığımda her ikisi de kutu olarak görünür ) , ancak UPPER()
işlev, küçük harfli sürümü büyük harfle değiştirmez, hatta geçerli Veritabanı için varsayılan Harmanlama olarak ayarlanır Latin1_General_100_CI_AS_SC
. Bu, bir Harmanlama: Harmanlama ve Unicode Desteği: Tamamlayıcı Karakterler kullanılırken listelenmeyen MSDN belgelerine UPPER
ve LOWER
işlev şemasına uygun görünüyor ._SC
SELECT N'DESERET SMALL LETTER OW' AS [Label], NCHAR(0xD801)+NCHAR(0xDC35) AS [Thing]
UNION ALL
SELECT N'DESERET CAPITAL LETTER OW' AS [Label], NCHAR(0xD801)+NCHAR(0xDC0D) AS [Thing]
UNION ALL
SELECT N'SmallButShouldBeCapital' AS [Label], UPPER(NCHAR(0xD801)+NCHAR(0xDC35)) AS [Thing]
Döndürür (ek karakteri görebilmeniz için büyütülmüş):
Unicode.org'daki aşağıdaki arama özelliğini kullanarak küçük ve büyük harf olan karakterlerin tam (ve geçerli) listesini görebilirsiniz ("DESERET" e ulaşıncaya kadar aşağı doğru kaydırarak Tamamlayıcı Karakterleri görebilirsiniz. bölümüne gidin veya Control-Fo kelimeyi tıklayın ve arayın):
http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3AChanges_When_Titlecased%3DYes%3A%5D
Dürüst olmakla birlikte, bu büyük bir fayda değildir, çünkü herkesin başlık kasası olabilecek herhangi bir Ek Karakterden herhangi birini kullandığından şüphelenilir. Her iki durumda da, burada SQLCLR kodu:
using System.Data.SqlTypes;
using System.Globalization;
using Microsoft.SqlServer.Server;
public class TitleCasing
{
[return: SqlFacet(MaxSize = 4000)]
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true)]
public static SqlString TitleCase([SqlFacet(MaxSize = 4000)] SqlString InputString)
{
TextInfo _TxtInf = new CultureInfo(InputString.LCID).TextInfo;
return new SqlString (_TxtInf.ToTitleCase(InputString.Value));
}
}
İşte @ MikaelEriksson'un önerisi - NVARCHAR
verileri işlemek ve tüm büyük harfli kelimeleri (.NET yönteminin davranışıyla daha yakından eşleştirmek için) atlamak için biraz değiştirilmiş - bu T-SQL uygulamasının ve SQLCLR uygulaması:
SET NOCOUNT ON;
DECLARE @a NVARCHAR(50);
SET @a = N'qWeRtY kEyBoArD TEST<>&''"X one&TWO '
+ NCHAR(0xD801)+NCHAR(0xDC28)
+ N'pPLe '
+ NCHAR(0x24D0) -- ⓐ Circled "a"
+ NCHAR(0xFF24) -- D Full-width "D"
+ N'D u'
+ NCHAR(0x0308) -- ̈ (combining diaeresis / umlaut)
+ N'vU'
+ NCHAR(0x0308) -- ̈ (combining diaeresis / umlaut)
+ N'lA';
SELECT @a AS [Original];
SELECT STUFF((
SELECT N' '
+ IIF(UPPER(T3.V) <> T3.V COLLATE Latin1_General_100_BIN2,
UPPER(LEFT(T3.V COLLATE Latin1_General_100_CI_AS_SC, 1))
+ LOWER(STUFF(T3.V COLLATE Latin1_General_100_CI_AS_SC, 1, 1, N'')),
T3.V)
FROM (SELECT CAST(REPLACE((SELECT @a AS N'*' FOR XML PATH('')), N' ', N'<X/>')
AS XML).query('.')) AS T1(X)
CROSS APPLY T1.X.nodes('text()') AS T2(X)
CROSS APPLY (SELECT T2.X.value('.', 'NVARCHAR(70)')) AS T3(V)
FOR XML PATH(''), TYPE
).value('text()[1]', 'NVARCHAR(70)') COLLATE Latin1_General_100_CI_AS_SC, 1, 1, N'')
AS [Capitalize first letter only];
SELECT dbo.TitleCase(@a) AS [ToTitleCase];
Davranıştaki diğer bir fark, bu özel T-SQL uygulamasının sadece boşluklara ayrılmasıdır, oysa ToTitleCase()
yöntem harf olmayan çoğu kelime ayırıcısı olarak kabul edilir (dolayısıyla "bir & İKİ" parçanın işlenmesindeki fark).
Her iki uygulama, birleştirme dizilerini doğru şekilde işler. "ÜvÜlA" daki aksanlı harflerin her biri bir temel harf ve birleştirici bir diyaer / umlauttan (her harfin üstünde iki nokta) oluşur ve her iki testte de doğru şekilde diğer duruma dönüştürülür.
Son olarak, SQLCLR sürümünün beklenmedik bir dezavantajı, çeşitli testlerle gelince, .NET kodunda Çember Harfleri (artık Microsoft Connect'te bildirildi - UPDATE: Connect /dev/null
- kelimenin tam anlamıyla - taşındı, bu yüzden sorun hala varsa bunu yeniden göndermem gerekebilir). .NET kütüphanesi, Dairesel Harfleri sözcük ayırıcıları olarak görür, bu nedenle ""D" yi "Ⓐdd" ye gerektiği gibi dönüştürmez.
Bilginize
Enkapsüle Önceden yapmaktan SQLCLR fonksiyonu TextInfo.ToTitleCase
yöntemi yukarıda belirtilen Serbest sürümünde artık kullanılabilir SQL # olarak (Yazdığım olan) String_ToTitleCase ve String_ToTitleCase4k .
😺