2009-05-07 8 views
3

値が列挙型の列を持つテーブルがあります。これらの値を取得時に「Friendly Names」に変換するTSQL関数を作成する必要があります。TSQLのPascalCase文字列を "フレンドリネーム"に変換

例:

'DateOfBirth' --> 'Date Of Birth' 
'PrincipalStreetAddress' --> 'Principal Street Address' 

私はストレートTSQL UDFソリューションを必要としています。私は、拡張ストアプロシージャまたはCLRコードをインストールするオプションはありません。

+1

1! – Joseph

答えて

2
/* 
Try this. It's a first hack - still has problem of adding extra space 
at start if first char is in upper case. 
*/ 
create function udf_FriendlyName(@PascalName varchar(max)) 
returns varchar(max) 
as 
begin 

    declare @char char(1) 
    set @char = 'A' 

    -- Loop through the letters A - Z, replace them with a space and the letter 
    while ascii(@char) <= ascii('Z') 
    begin 
     set @PascalName = replace(@PascalName, @char collate Latin1_General_CS_AS, ' ' + @char) 
     set @char = char(ascii(@char) + 1) 
    end 

    return LTRIM(@PascalName) --remove extra space at the beginning 

end 
+0

余分なスペースを削除するためにSUBSTRINGを追加した後、それは魅力的なように機能します。ありがとうございます(ありがとうございます! –

+2

ほんの少しの提案:代わりに、最終的な リターンSUBSTRING(@ PascalName、2、LEN(@PascalName))--removeスペースのことはありませんあなたは リターンLTRIM(@PascalName) を使用している可能性が 初めに大きな違いはありますが、一般的には先頭のスペースは削除されますが、それ以外の文字はスペース以外のものは削除されません。 –

+0

@Turro - 大きなヒント。 、今更新しました。ありがとうございました! –

1

SQL Server 2005を使用している場合は、ネイティブのCLR手順記述することができます。

static string ToFriendlyCase(this string PascalString) 
{ 
    return Regex.Replace(PascalString, "(?!^)([A-Z])", " $1"); 
} 

出力:

フレンドリーケースに私のクレイジーパスカルケース文を変換します

でない場合は、手動で解析するか、extendを使用して正規表現オブジェクトを参照する必要がありますプロシージャ。良い記事はここで見つけることができます:

http://www.codeproject.com/KB/mcpp/xpregex.aspx

編集:正規表現のCOMオブジェクトを登録することはできませんので、それはそのアイデアを投げかけて A UDFは、データベースに影響を与えることができません。しかし、ストアドプロシージャは可能です - それはルートかもしれません。

大文字と小文字を区別して比較するには、大文字と小文字を区別するようにクエリの照合順序を設定してから、置き換えを使用する必要があります。ここでは、ポインティングに役立つ記事があります右方向へのあなたのオフ:何かに@argの

http://www.mssqltips.com/tip.asp?tip=1032

+0

ストレートTSQL UDFを使用する必要があります。 CLR機能は私の選択肢ではありません。 –

+0

うーん、うんざりですが、UDFを使用して実行できるかどうかわかりません... UDFがデータベースに影響を与えないため、正規表現ライブラリを登録できないためです。ストアドプロシージャを使用して実行する必要があります。私はあなたが手動でそれを解析しなければならないと確信しています。 – BenAlabaster

+0

これはX M LのXMLもsliptします。 :/ 新しい正規表現( @ "(?<= [AZ])(?= [AZ] [az])|(?<= [^ AZ])(?= [AZ]) RegexOptions.IgnorePatternWhitespace' – Custodio

1
 

declare @arg varchar(20) 
set @arg = 'DateOfBirthOnMonday' 

declare @argLen int 
set @argLen = len(@arg) 

declare @output varchar(40) 
set @output = '' 

declare @i int 
set @i = 1 

declare @currentChar varchar(1) 
declare @currentCharASCII int 

while (1 = 1) 
begin 
set @currentChar = substring(@arg, @i, 1) 
set @currentCharASCII = ascii(@currentChar) 

if (@currentCharASCII >= 65 and @currentCharASCII <= 90) 
set @output = @output + ' ' 

set @output = @output + @currentChar 

set @i = @i+ 1 

if (@i > @argLen) break 
end 

set @output = ltrim(rtrim(@output)) 
print @output 
 

変更値は、あなたがテストしたいです。

また、必要な場合がある@arg +スペースの長さと同じ長さの文字列に対応するために、@出力の宣言を変更する必要があります。私は私の例でそれを倍増しました。

+0

@Shahkalpesh - 次の行に構文エラーがあります:(@currentCharASCII> = 65および@currentCharASCII @argLen) –

+0

私もそれをテストしました。コンパイルされません。 -1 – ichiban

+0

だから<=記号。私は再び投稿を書式設定しました。今はOKだろう。 – shahkalpesh

1

は、最もエレガントな解決策が、それは動作します:

declare @pascalCasedString nvarchar(max) = 'PascalCasedString' 
declare @friendlyName nvarchar(max) = '' 
declare @currentCode int; 
declare @currentChar nvarchar; 

while (LEN(@pascalCasedString) > 0) 
    begin 
     set @currentCode = UNICODE(@pascalCasedString) 
     set @currentChar = NCHAR(@currentCode) 

     if ((@currentCode >= 65) AND (@currentCode <= 90)) 
     begin 
      set @friendlyName += SPACE(1) 
     end 
     set @friendlyName += @currentChar 
     set @pascalCasedString = RIGHT(@pascalCasedString,LEN(@pascalCasedString) - 1) 
    end 

select @friendlyName 
+0

このコードはSQL Serverでコンパイルされません。私はこれがPLSQLかMySQLのどちらかと仮定します。 –

+0

私はこのコードがうまくいくと思います。 TSQLに準拠させると、私はあなたにアップフォートを与えます。 – ichiban

+0

さらに調査すると、SQL Server 2008では構文が機能することが判明しましたが、古いバージョンでは構文が失敗します。それにもかかわらず。 +1 –

0

私は必要に応じて、これは正確に動作しました。 SqlAuthority.comの礼儀:

CREATE FUNCTION dbo.udf_TitleCase (@InputString VARCHAR(4000)) 
RETURNS VARCHAR(4000) 
AS 
BEGIN 
DECLARE @Index INT 
DECLARE @Char CHAR(1) 
DECLARE @OutputString VARCHAR(255) 
SET @OutputString = LOWER(@InputString) 
SET @Index = 2 
SET @OutputString = 
STUFF(@OutputString, 1, 1,UPPER(SUBSTRING(@InputString,1,1))) 
WHILE @Index <= LEN(@InputString) 
BEGIN 
SET @Char = SUBSTRING(@InputString, @Index, 1) 
IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&','''','(') 
IF @Index + 1 <= LEN(@InputString) 
BEGIN 
IF @Char != '''' 
OR 
UPPER(SUBSTRING(@InputString, @Index + 1, 1)) != 'S' 
SET @OutputString = 
STUFF(@OutputString, @Index + 1, 1,UPPER(SUBSTRING(@InputString, @Index + 1, 1))) 
END 
SET @Index = @Index + 1 
END 
RETURN ISNULL(@OutputString,'') 
END 

使用法:

SELECT dbo.udf_TitleCase('This function will convert this string to title case!') 

出力:ちょうどその問題に対処することについて

This Function Will Convert This String To Title Case!