SQL Server 2016拆分Name列更新FirstName与LastName字段的实现方案
解决方案
SQL Server 2016版本的STRING_SPLIT既不支持ordinal参数,也不保证返回的拆分结果顺序和原字符串中的顺序一致,所以原有写法不仅拿不到第二个拆分值,还可能出现顺序错乱的问题。在你给定的简化假设下,直接用字符串截取函数是性能最优、逻辑最简洁的实现方案:
1. 先运行SELECT预览结果验证逻辑
SELECT [Name], LEFT([Name], CHARINDEX(' ', [Name]) - 1) AS FirstName, RIGHT([Name], LEN([Name]) - CHARINDEX(' ', [Name])) AS LastName FROM UserTable WHERE LastName IS NULL AND [Name] IS NOT NULL
- 逻辑说明:
CHARINDEX(' ', [Name])用于定位空格在Name字段中的下标位置- 用
LEFT截取空格之前的内容作为FirstName - 用
RIGHT截取空格之后的内容作为LastName
2. 执行UPDATE操作
确认SELECT返回的结果符合预期后,运行以下更新语句:
UPDATE UserTable SET FirstName = LEFT([Name], CHARINDEX(' ', [Name]) - 1), LastName = RIGHT([Name], LEN([Name]) - CHARINDEX(' ', [Name])) WHERE LastName IS NULL AND [Name] IS NOT NULL
注:如果你的SQL Server实例配置了
ANSI_PADDING OFF,可能存在尾部空格导致LEN计算不准的情况,可以把LEN([Name])替换为DATALENGTH([Name])/2(NVARCHAR类型),如果是VARCHAR类型直接用DATALENGTH([Name])即可。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

