SQL Server如何拆分全名为姓和名并截取姓氏前20字符解决数据截断报错
解决方案
你可以在现有LastName的截取逻辑外层再加一层SUBSTRING,限制取前20个字符即可,同时建议补充空格不存在的异常处理,避免CHARINDEX返回0时触发语法错误。
修改后的完整SQL语句如下:
SELECT -- 兼容无空格的DisplayName场景,避免CHARINDEX为0时报错 SUBSTRING(DisplayName, 1, CASE WHEN CHARINDEX(' ', DisplayName) > 0 THEN CHARINDEX(' ', DisplayName) - 1 ELSE LEN(DisplayName) END) AS [FirstName], -- 限制LastName最长取20个字符,匹配目标表字段长度要求 SUBSTRING( CASE WHEN CHARINDEX(' ', DisplayName) > 0 THEN SUBSTRING(DisplayName, CHARINDEX(' ', DisplayName) + 1, LEN(DisplayName)) ELSE '' END, 1, 20 ) AS [LastName] FROM [Destination_Table] WHERE VoidFlag = 0 AND ControlPlanCode = @ControlPlan
说明
- 核心修改点是对LastName的截取结果额外加了一层
SUBSTRING(xxx,1,20),强制只取前20个字符,解决数据截断报错问题 - 额外补充的CASE判断用于处理DisplayName不含空格的异常场景:如果DisplayName没有空格,原有逻辑中
CHARINDEX(' ', DisplayName) - 1会得到-1,导致SUBSTRING执行报错,新增判断后无空格时会把全值作为FirstName,LastName留空 - 如果你确认业务场景下的DisplayName必然存在空格,也可以简化写法,仅修改LastName部分即可:
SUBSTRING(SUBSTRING(DisplayName, CHARINDEX(' ', DisplayName) + 1, LEN(DisplayName)),1,20) AS [LastName]
内容的提问来源于stack exchange,提问作者Faiz
相关产品推荐
相关产品推荐

