假设我在tableA中有一个列名
Name
jennifer Hughs
Mike nadrotosky
Arnold Woods
Raj Jai Soni
那么如何将这些结果放在单独的3列中,如
FirstName MiddleName LastName
Jennifer Hughs
.
.
.
Raj Jai Soni
我尝试使用Substring但没有工作。
答案 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中做这件事!
为了在T-SQL中执行此操作,我使用SQL Sharp中的字符串拆分功能完成了此操作。然而,这最终会产生与@marc_s相似的结果,所以我不会在这里讨论它。