SQL Server 2016视图中实现INITCAP及XML编码字符处理问询
SQL Server 2016 视图中实现INITCAP及FOR XML编码处理方案
一、INITCAP功能实现(无自定义函数/存储过程)
SQL Server 2016无内置INITCAP函数,且STRING_SPLIT无法保证拆分顺序、STRING_AGG为2017+版本功能。采用递归CTE拆分字符串+大小写转换+XML拼接方案,确保单词顺序和功能正确性:
CREATE VIEW vw_InitCapResult AS SELECT t.OriginalString, STUFF(( SELECT ' ' + UPPER(LEFT(s.Word, 1)) + LOWER(SUBSTRING(s.Word, 2, LEN(s.Word))) FROM ( -- 递归CTE按空格拆分,通过Ordinal列严格保留单词顺序 WITH SplitCTE AS ( SELECT 1 AS Ordinal, CHARINDEX(' ', t.OriginalString + ' ') AS NextSpace, LEFT(t.OriginalString, CHARINDEX(' ', t.OriginalString + ' ') - 1) AS Word, t.OriginalString AS Remaining FROM YourBaseTable t UNION ALL SELECT sc.Ordinal + 1, CHARINDEX(' ', sc.Remaining + ' ', sc.NextSpace + 1), SUBSTRING(sc.Remaining, sc.NextSpace + 1, CHARINDEX(' ', sc.Remaining + ' ', sc.NextSpace + 1) - sc.NextSpace - 1), sc.Remaining FROM SplitCTE sc WHERE sc.NextSpace < LEN(sc.Remaining) ) SELECT Word FROM SplitCTE WHERE Word <> '' -- 过滤连续空格产生的空单词 ) s FOR XML PATH(''), TYPE ).value('.', 'nvarchar(max)'), 1, 1, '') AS InitCapResult FROM YourBaseTable t
核心细节:
- 递归CTE通过
Ordinal字段保证拆分后单词的原始顺序,替代无顺序的STRING_SPLIT - 对每个单词执行首字母大写、其余小写的转换逻辑
- 用
FOR XML PATH(''), TYPE配合.value('.', 'nvarchar(max)')拼接,同时规避特殊字符编码问题
二、FOR XML编码字符通用处理方法
使用FOR XML拼接时,&、<、>等特殊字符会被编码为XML实体(如&、<),直接提取会导致字符异常。通用解决方式如下:
正确拼接逻辑
必须使用FOR XML PATH(''), TYPE生成XML类型结果,再通过.value('.', 'nvarchar(max)')提取值,XML实体将自动还原为原始字符:
-- 示例:拼接含特殊字符的字段内容 SELECT STUFF(( SELECT '|' + ColumnWithSpecialChars FROM YourTable FOR XML PATH(''), TYPE ).value('.', 'nvarchar(max)'), 1, 1, '') AS CombinedResult
注意事项
- 禁止直接使用
FOR XML PATH('')生成字符串(无TYPE关键字),否则特殊字符会被永久编码 - 该方案可覆盖所有XML敏感字符(如双引号
"),无需额外写REPLACE替换逻辑
内容的提问来源于stack exchange,提问作者dougp
相关产品推荐
相关产品推荐

