如何在SQL Server 2005中分块记录?

时间:2011-03-10 21:48:01

标签: sql-server sql-server-2005 text-manipulation

假设我在tableA中有一个列名

Name
jennifer Hughs
Mike nadrotosky
Arnold Woods
Raj Jai Soni

那么如何将这些结果放在单独的3列中,如

FirstName MiddleName LastName
Jennifer              Hughs
.
.
.
Raj        Jai       Soni

我尝试使用Substring但没有工作。

2 个答案:

答案 0 :(得分:3)

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

我的方法是创建一个封装该逻辑的存储函数 - 在内联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)

并且该SELECT的输出是:

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

答案 1 :(得分:0)

@marc_s答案是最完整的。我不得不这么做几次,他们一直作为一次性数据加载类型的工作。如果你的相同,我强烈建议你在Excel中做这件事!

  1. 将表格从Management studio复制并粘贴到Excel
  2. 将文字用于列
  3. 重新排序第3列的整行以获取顶部
  4. 所有没有中间名的行
  5. 选择所有具有空列3的值并将值从第2列移至第3列
  6. 将数据导入目标SQL表
  7. 为了在T-SQL中执行此操作,我使用SQL Sharp中的字符串拆分功能完成了此操作。然而,这最终会产生与@marc_s相似的结果,所以我不会在这里讨论它。