我正在尝试将全名分为最后,第一,中间和后缀。我搜索但找不到与我的格式完全相同的格式。我有以下代码,但运行完整选择时出现此错误。
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 :(得分: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提取字符串的一部分。