2010-12-14 7 views
0

完全な名前を最後、最初、中間、および後置に分割しようとしています。私は検索しましたが、私と同じフォーマットを見つけることができませんでした。私は次のコードを持っていますが、完全な選択を実行するとこのエラーが発生します。sqlはフルネームのフィールドを最初、中、最後、およびサフィックスに解析します

Msg 537, Level 16, State 3, Line 1 
Invalid length parameter passed to the LEFT or SUBSTRING function. 

SpaceCommaテーブルが正しいインデックスを取得します。 これは私が持っている名前の形式です:

CREATE TABLE #myfullnames (fullName VARCHAR(50)) 
    GO 

    INSERT #myfullnames VALUES ('BROOK SR, JAMES P.') 
    INSERT #myfullnames VALUES ('BLOCK JR., BILL V.') 
    INSERT #myfullnames VALUES ('MOOR, CLODE M.') 
    INSERT #myfullnames VALUES ('SOUDER III, Laurence R.') 
    INSERT #myfullnames VALUES ('SOUDER, WILL') 
    INSERT #myfullnames VALUES ('KOLIV, Kevin E.') 
    INSERT #myfullnames VALUES ('Simk, JR. Thomas Todd') 
    INSERT #myfullnames VALUES ('Polio, Gary R.') 

私はあなたの助けをいただければ幸いです。ありがとう。

select SplitNames.LastName, SplitNames.FirstName, 
     SplitNames.MiddleName, SplitNames.Title 
from (
    select [fullName] 
, substring([fullName], 1, SpceTitle-1) as LastName 
, substring([fullName], SpceMid,(SpceMid - SpceFirstName - 1)) as FirstName 
, substring([fullName], SpaceComma.SpceTitle, (SpaceComma.SpceFirstName - 
    SpaceComma.SpceTitle)) as Title 
, nullif(substring([fullName],SpaceComma.SpceMid+1,100),'') as  
    MiddleName  
from (
    select [fullName], 
    charindex(',',[fullName]) as Comma, 
    charindex(' ',[fullName]+space(1),charindex(',',[fullName])) as 
      SpceFirstName, 
    (len([fullName]) + 1 - charindex(' ',reverse([fullName]), 0)) as 
      SpceMid,   
    charindex(' ',[fullName], charindex (' ',reverse([fullName]))) as SpceTitle 
    from #myfullnames 
    ) SpaceComma 
) SplitNames 

DROP TABLE #myfullnames 

答えて

0

例のデータは固定されたルールセットに従わないため、名前を解析するのに最適なソリューションはありません。ルール違反の例は、 "JR"がカンマの中にあり、他のものではないという点で "Simk"と "BLOCK"の間です。ルール違反の唯一の解決策は違反者を手動で修正することです。

SQL Serverの "PARSENAME"関数を使用して名前を解析できます。 SQL ServerはPARSENAMEを使用してSERVERNAME.DATABASE.SCHEMA.TABLEを分離し、4つの部分に制限されています。ここで

select fullname 
, REPLACE(fullname,'.','') AS [1] 
, REPLACE(REPLACE(fullname,'.',''),', ','.') AS [2] 
, ParseName(REPLACE(REPLACE(fullname,'.',''),', ','.'),2) AS [3] 
, REPLACE(ParseName(REPLACE(REPLACE(fullname,'.',''),', ','.'),1),' ','.') AS [4] 
, PARSENAME(REPLACE(ParseName(REPLACE(REPLACE(fullname,'.',''),', ','.'),1),' ','.'),1) AS [5] 
, PARSENAME(REPLACE(ParseName(REPLACE(REPLACE(fullname,'.',''),', ','.'),1),' ','.'),2) AS [6] 
from #myfullnames 

6つの出力列を解析し、クエリがで文字を置き換えるの使用証明さ「を。」 PARSENAMEを使用して文字列の一部を抽出します。

関連する問題