2010-12-14 25 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

您示例中的數據不遵循任何固定的規則集,因此不會有解析名稱的完美解決方案。違反規則的一個例子是在「Simk」和「BLOCK」之間,因爲「JR」在一個逗號中而不在另一個逗號中。違反規則的唯一解決方案是手動糾正違規者。

我們可以使用SQL Server中的「PARSENAME」函數解析名稱。 SQL Server使用PARSENAME來分隔SERVERNAME.DATABASE.SCHEMA.TABLE並限制爲四個部分。

這裏是一個解析名稱

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 

六個輸出列的查詢演示瞭如何使用與替換字符「」然後使用PARSENAME提取字符串的一部分。

相關問題