2

我目前正在开展一个将数据从一个表导入到另一个表的项目。我正在尝试将包含 FULLNAME 的字段解析为其 LAST、FIRST、MI 部分。这些名称都采用“LAST,FIRST MI”的格式我已经编写了一个存储过程,它可以正确解析并根据需要返回结果,但我不确定如何将存储过程合并到单个 select 语句中。例如,当前我有:

SELECT FULLNAME From UserInfo

我想要的是这样的:

SELECT Last, First, MI from UserInfo

目前我的存储过程采用 ParseName(FULLNAME, Last as OUTPUT, First as OUTPUT, MI as OUTPUT) 的形式。如何调用此过程并将输出变量分成 3 个不同的列?

4

3 回答 3

1

用表值函数替换您的存储过程。然后,您可以将此函数应用于所有行。

下面是一个示例 - 只需输入您解析名称的逻辑

create FUNCTION dbo.f_parseName(@inFullName varchar(255))
RETURNS 
    @tbl TABLE (lastName varchar(255), firstName varchar(255), middleName varchar(255))
as
BEGIN
-- put your logic here
insert into @tbl(lastName,firstName,middleName)
select substring(@inFullName,0,10),substring(@inFullName,11,10), substring(@inFullName,21,10)

return

end

应用函数

-- sample data
declare @fullNames table (fullName varchar(255))
insert into @fullNames (fullName) values
('111111111122222222223333333333')
,('AAAAAAAAAABBBBBBBBBBCCCCCCCCCC')


select 
    fn.fullName
    ,pn.lastName
    ,pn.firstName
    ,pn.middleName
from 
    @fullNames fn
    cross apply dbo.f_parseName(fn.fullName) pn
于 2012-09-28T12:11:21.677 回答
1

您可以将存储过程的结果放在(临时)表中,如下所示(我添加了FULLNAME列以提供连接条件,您必须调整存储过程才能做到这一点):

CREATE TABLE #temp (
  FULLNAME NVARCHAR(..)
  ,Last NVARCHAR(..)
  ,First NVARCHAR(..)
  ,MI NVARCHAR(..)
);

INSERT INTO #temp (Last, First, MI)
EXECUTE MySproc;

如果您希望能够在SELECT Last, First, MI from UserInfo结构上执行,您必须首先向 UserInfo 添加三列作为您的名称信息,然后插入您从存储过程中获得的解析数据。

编辑

您提到您使用 aSELECT ... INTO ...将数据放入新表中。我猜新表没有该FULLNAME列,然后最好使用表值函数(如this answer所示)。但是,如果您保留该FULLNAME列,则可以使用它将临时表与新表连接以更新新表,如下所示:

UPDATE NUI
  SET NUI.Last = T.Last, NUI.First = T.First, NUI.MI = T.MI
  FROM NewUserInfo AS NUI
  INNER JOIN #temp AS T ON NUI.FULLNAME = T.FULLNAME;

UPDATE如果您的新表中没有该列,您也可以将此方法与另一个连接条件一起使用FULLNAME,但请确保事先运行良好的测试以检查连接是否成立。

希望这有帮助,祝你好运!

于 2012-09-28T10:28:14.997 回答
0

您可以像这样将计算列添加到表中:

alter table UserInfo
    add firstName as SUBSTRING(fullName, CHARINDEX(',',fullName,0)+2, LEN(fullName)-CHARINDEX(',',fullName,0)-CHARINDEX(' ', REVERSE(fullName),0)-1)
        ,lastName as SUBSTRING(fullName, 0, CHARINDEX(',',fullName,0))
        ,middleInitital as REVERSE(SUBSTRING(REVERSE(fullName),0,CHARINDEX(' ', REVERSE(fullName),0)))

但最好的解决方案是反其道而行之。用真实列对数据进行规范化firstNamelastName并对middleInitial进行计算列fullName

上面代码中的表达式可能需要更多的工作,因为我确信它们可以更有效地编写。我只是让他们工作来展示这个想法。

创建计算列后,您可以这样做:

select  firstName
        ,lastName
        ,middleInitital
from UserInfo
于 2012-09-28T10:59:08.470 回答