![](/img/trans.png)
[英]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.