2017-01-04 17 views
0

関数を使用せずに、selectステートメントでセル内の各単語の最初の文字のみを大文字にする方法に関する提案はありますか?データベースに関数/ビュー/テーブルを作成する権限がないので、OGRを使用してバッチジョブで自動化されたクエリ/ select文を実行する必要があります。SQL Server:関数を使用せずに各単語の最初の文字を大文字にする

私は、セル全体の最初の文字が大文字になっているか、問題を関数で解決している例しか見つけることができません。

それは次のように文字列で名前列に関する

:ちょうど楽しみのために
'JOHN DOE'
'JOHN JANE-DOE'
'JOHN-JANE DOE'
''
'JOHN'

+5

データベースに適切な権限がない場合は、アプリケーション側でこれを行う必要があります。 –

+2

データベースレイヤーでこれを行うことは賢明な考えだったとしても、あなたが求めているものの複雑さを理解してもらいたいですか?適切な大文字小文字の名前は、「最初の文字を大文字にする」ほど簡単ではありません。 「オニール」や「マクドナルド」などの名前はうまく再生されません。 – iamdave

+0

あなたが適切なパーミッションを取得しても、SQL以外のものでこれをやりたいと思うかもしれません - 純粋なT-SQLを使用するソリューションがありますが、パフォーマンスはあまり良くありません。 SQL文の代わりに呼び出されるSSISパッケージを作成することも考えられます。 –

答えて

2

Declare @YourTable table (ID int,Name varchar(50)) 
Insert Into @YourTable values 
(1,'JOHN DOE'), 
(2,'JOHN JANE-DOE'), 
(3,'JOHN-JANE DOE'), 
(4,''), 
(5,'JOHN'), 
(6,'PATTY O''BRIAN'), 
(7,'OLD MCDONALD') 


Declare @Str varchar(max) = (Select ID,Name=Lower(Name) from @YourTable for XML Raw) 
Select @Str = Replace(@Str,MapFrom,MapTo) 
From (
     Select MapFrom=P+C 
       ,MapTo =Upper(P+C) 
     From (Select * From (Values ('"'),(' '),('-'),(' O'''),(' Mc')) P (P)) A 
     Cross Join (Select Top 26 C=Char(96+Row_Number() Over (Order By Number)) From master..spt_values) C 
     Union All 
     Select * From (Values (' MC',' Mc')) P (MapFrom,MapTo) 
    ) A 
Declare @XML xml = cast(@Str as XML) 
Select ID = r.value('@ID','int') 
     ,Name = r.value('@Name','varchar(50)') 
From @XML.nodes('/row') as A(r) 
Cross Apply A.r.nodes('./@*') AS B(attr) 
Where attr.value('local-name(.)','varchar(100)') not in ('ID','Active') 

戻り

ID Name 
1 John Doe 
2 John Jane-Doe 
3 John-Jane Doe 
4 
5 John 
6 Patty O'Brian 
7 Old McDonald 
1

申し訳ありません、私はStackoverflowを新しくしていますが、この質問の複雑さの程度を認識していませんでした。

データベースのインフラストラクチャを提供する会社は、正しい形式の名前を持つ追加のテーブルを提供しています。だから私は、私が働いているテーブルの正しいフォーマットされた名前に参加しました。

ありがとうございました。

関連する問題