[英]SQL Server: capitalize first letter of each word without using function
[英]Capitalize first letter, every word, fix possible string split order issues, multiple delimiters in T-SQL 2017 without using a user-defined function
只是好奇是否有更好的方法将每个单词的第一个字母大写,解决字符串拆分可能出现的排序问题,更容易包含其他分隔符。
这用于报告,最好不要使用用户定义的函数,以便代码可以在报告中。
代码可以扩展以包含额外的分隔符,这里包含了两个,但这是最好的方法吗?
/* Capitalize first letter of every word, fixing possible ordering issues with string split, including words following a dash in ('-') */
SELECT RIGHT(((SELECT ' '+(UPPER(LEFT([value], 1))+SUBSTRING([value], 2, LEN([Column])))
FROM(SELECT [value], ROW_NUMBER() OVER (ORDER BY [pointer]) AS [p]
FROM(SELECT [value], CHARINDEX(' '+[value]+' ', ' '+[Column]+' ') AS [pointer]
FROM STRING_SPLIT((SELECT '-'+(UPPER(LEFT([value], 1))+LOWER(SUBSTRING([value], 2, LEN([Column]))))
FROM(SELECT [value], ROW_NUMBER() OVER (ORDER BY [pointer]) AS [p2]
FROM(SELECT [value], CHARINDEX('-'+[value]+'-', '-'+[Column]+'-') AS [pointer]
FROM STRING_SPLIT([Column], '-')) AS [sp2] ) AS [s2]
FOR XML PATH('')), ' ')) AS [sp] ) AS [s]
FOR XML PATH(''))), LEN([Column])) AS [Column_Cased]
FROM [Database].[Table];
以下是仅搜索一个分隔符的代码,如果这样更容易理解:
SELECT (SELECT ' '+(UPPER(LEFT([value], 1))+LOWER(SUBSTRING([value], 2, LEN([Column]))))
FROM(SELECT [value], ROW_NUMBER() OVER (ORDER BY [pointer]) AS [p]
FROM(SELECT [value], CHARINDEX(' '+[value]+' ', ' '+[Column]+' ') AS [pointer]
FROM STRING_SPLIT([Column], ' ')) AS [sp] ) AS [s]
FOR XML PATH('')) AS [Column_Cased]
FROM [Database].[Table];
以及搜索两个分隔符的代码,但未纠正可能的字符串拆分顺序问题:
SELECT RIGHT(((SELECT ' '+(UPPER(LEFT([value], 1))+SUBSTRING([value], 2, LEN([Column])))
FROM(SELECT [value]
FROM STRING_SPLIT((SELECT '-'+(UPPER(LEFT([value], 1))+LOWER(SUBSTRING([value], 2, LEN([Column]))))
FROM(SELECT [value] FROM STRING_SPLIT([Column], '-')) AS [s2]
FOR XML PATH('')), ' ')) AS [s]
FOR XML PATH(''))), LEN([Column])) AS [Column_Cased]
FROM [Database].[Table];
/* Following spaces */
IF CHARINDEX(' ', @string)<>0 BEGIN
DECLARE @i INT=@first;
DECLARE @delimiter CHAR(1) =' ';
WHILE @i<=@last BEGIN
SET @string=REPLACE(@string, @delimiter+CHAR(@i), @delimiter+CHAR(@i));
SET @i=@i+1;
END;
END;
/* Following dashes */
IF CHARINDEX('-', @string)<>0 BEGIN
SET @i=@first;
SET @delimiter='-';
WHILE @i<=@last BEGIN
SET @string=REPLACE(@string, @delimiter+CHAR(@i), @delimiter+CHAR(@i));
SET @i=@i+1;
END;
END;
/* First Letter */
SET @string=UPPER(LEFT(@string, 1))+RIGHT(@string, LEN(@string)-1);
RETURN @string;
然后我最终在 SSRS 中使用了 VB 函数。 感谢您的意见@Larnu
=StrConv(Fields!Column.Value, vbProperCase)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.