Sql server 如何在SQLServer2005中分块记录?

Sql server 如何在SQLServer2005中分块记录?,sql-server,sql-server-2005,text-manipulation,Sql Server,Sql Server 2005,Text Manipulation,假设我在表a中有一个列名 Name jennifer Hughs Mike nadrotosky Arnold Woods Raj Jai Soni 那么,我如何将这些结果分别放在3列中,如 FirstName MiddleName LastName Jennifer Hughs . . . Raj Jai Soni 我试过使用子字符串,但不起作用 嗯,这看起来比实际容易得多——特别是如果你开始有多个名字和/或中间名的人 我的方法是创建一个

假设我在表a中有一个列名

Name
jennifer Hughs
Mike nadrotosky
Arnold Woods
Raj Jai Soni
那么,我如何将这些结果分别放在3列中,如

FirstName MiddleName LastName
Jennifer              Hughs
.
.
.
Raj        Jai       Soni

我试过使用子字符串,但不起作用

嗯,这看起来比实际容易得多——特别是如果你开始有多个名字和/或中间名的人

我的方法是创建一个封装该逻辑的存储函数——在内联T-SQL语句中解释它并不是那么简单

这里是第一次尝试-只要您的中间名不超过一个,就可以使用:

CREATE FUNCTION dbo.SplitName(@InputName VARCHAR(200))
RETURNS @nameParts TABLE 
(
    FirstName VARCHAR(100),
    MiddleName VARCHAR(100),
    LastName VARCHAR(100)
)
AS BEGIN
    DECLARE @FirstSpace INT, @LastSpace INT

    SET @FirstSpace = CHARINDEX(' ', @InputName)
    SET @LastSpace = CHARINDEX(' ', @InputName, @FirstSpace+1)

    INSERT INTO @nameParts(FirstName, MiddleName, LastName)
        SELECT
            SUBSTRING(@InputName, 1, @FirstSpace),
            CASE @LastSpace 
                WHEN 0 THEN CAST(NULL AS VARCHAR(100))
                ELSE SUBSTRING(@InputName, @FirstSpace+1, @LastSpace - @FirstSpace)
            END,
            CASE @LastSpace 
                WHEN 0 THEN SUBSTRING(@InputName, @FirstSpace+1, 999)
                ELSE SUBSTRING(@InputName, @LastSpace, 999)
            END

    RETURN
END
如果使用一些示例数据对此进行测试,将得到以下结果:

DECLARE @nameTable TABLE (NameValue VARCHAR(100))

INSERT INTO @nametable VALUES('Jennifer Hughes')
INSERT INTO @nametable VALUES('Mike Nadrotosky')
INSERT INTO @nametable VALUES('Arnold Woods')
INSERT INTO @nametable VALUES('Raj Jai Soni')

SELECT *
FROM @nameTable
CROSS APPLY dbo.SplitName(nameValue)
该选择的输出为:

NameValue          FirstName   MiddleName    LastName
Jennifer Hughes    Jennifer       NULL       Hughes
Mike Nadrotosky    Mike           NULL       Nadrotosky
Arnold Woods       Arnold         NULL       Woods
Raj Jai Soni       Raj            Jai        Soni

@马克的答案是最完整的。我不得不这样做的几次都是一次性的数据加载类型的工作。如果你的是相同的,我强烈建议只做Excel

将表格从Management studio中复制并粘贴到Excel中 使用文本编辑列 对第3列的整行重新排序,以获得顶部没有中间名的所有行 选择第3列为空的所有值,并将值从第2列移到第3列 将数据导入到目标SQL表中
为了在T-SQL中实现这一点,我在中使用了字符串拆分函数。不过,这最终将产生与@marc_s类似的结果,因此我不在此赘述。

如果某人的名字是Raj Jai Mai Soni,会发生什么?嗨,Tim,谢谢,这是个好问题。如果是那样的话,Mai Soni将以姓氏离开。这里我有一些东西,但不知道这是否有帮助。。从temp中选择前1名、子字符串名、1、6作为名字、子字符串名、6、2作为姓氏、子字符串名、8、2作为姓氏如果某人的名字是Billy Bob Earth Jones,Jones是姓,Earth是中间名,Billy Bob是名,会发生什么?我喜欢你的方法。如果要使用它获取多个中间名,则规则为first+middle+middle+…+最后,您可以使用反向charindex反转字符串和子字符串以获取姓氏,然后将其放在最后,先放在第一,其余放在中间。您好@marc_感谢您的帮助。但是如果我运行您的查询,它会给出错误:INSERT语句的select列表包含的项目少于INSERT列表。SELECT值的数量必须与INSERT列的数量匹配。我不知道出了什么问题。@Programmer:对不起,我的表中有一些测试变量来让它工作-我已经更新了我的答案,我希望现在可以工作了!是的,我知道了。非常感谢你的帮助。只是一个奇怪的问题,如果我只想要姓氏栏H,N,W,S中的第一个字母,我该怎么做?Thanks@Programmer:SUBSTRINGLastName,1,1