簡體   English   中英

大寫第一個字母,每個單詞,修復可能的字符串拆分順序問題,T-SQL 2017 中的多個分隔符,而不使用用戶定義的函數

[英]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];

@Larnu喜歡的答案開始

/* 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM