SQL Server:使所有大写字母变为适当的大小写/标题大小写


96

我有一个作为所有大写字母导入的表,我想将其转换为大写字母。你们使用什么脚本来完成此任务?


4
请记住,在某些情况下,正确地将大写字母更改为大写字母可能需要手动更正。例如,使用名称:我不喜欢使用拼写错误的名称的应用程序。
戴夫·杜普兰蒂斯

2
地球上将没有任何功能可以使“ DAVE DUPLANTIS”正确。上层数据本身就是一个很大的WTF,因为在大多数情况下,这只是一个表象问题。
Tomalak

1
我认识一个麦克唐纳德,当他被称做麦克唐纳时就大为恼火。我也很感谢O'Keefe的适当包装。
DOK

@Tomalak:非常正确,这就是为什么您应该接受大小写混合的数据并将其保留,以便在您选择时保留。完全同意WTF部分……尤其是如果您接受“国际”字符。
戴夫·杜普兰蒂斯

这也是一个文化问题。以我的经验,英国和法国人习惯在任何有机会的地方大写姓氏的习惯。我只是不明白,它没有增加任何价值。
托玛拉克

Answers:


91

这是可以解决问题的UDF ...

create function ProperCase(@Text as varchar(8000))
returns varchar(8000)
as
begin
  declare @Reset bit;
  declare @Ret varchar(8000);
  declare @i int;
  declare @c char(1);

  if @Text is null
    return null;

  select @Reset = 1, @i = 1, @Ret = '';

  while (@i <= len(@Text))
    select @c = substring(@Text, @i, 1),
      @Ret = @Ret + case when @Reset = 1 then UPPER(@c) else LOWER(@c) end,
      @Reset = case when @c like '[a-zA-Z]' then 0 else 1 end,
      @i = @i + 1
  return @Ret
end

不过,您仍然必须使用它来更新数据。


15
对于非英语输入,这会爆炸。
Tomalak

谢谢!即使在Azure SQL Server上也可以使用:)
Aaron

我能问一下它进入哪个数据库和表吗?
v3nt

2
在SQL Server 2008和所有重音中进行了尝试,像魅力一样。它实际上取决于整理
Baptiste

谢谢!其给出的结果符合预期。
Palak Patel'5

109

该功能:

  • “适当的情况”用空格分隔的所有“大写”单词
  • 不理会“小写字母”
  • 即使对于非英语字母也可以正常工作
  • 具有可移植性,因为它不使用最新SQL Server版本的精美功能
  • 可以轻松更改为使用NCHAR和NVARCHAR来支持unicode,以及您认为合适的任何参数长度
  • 可以配置空白定义
CREATE FUNCTION ToProperCase(@string VARCHAR(255)) RETURNS VARCHAR(255)
AS
BEGIN
  DECLARE @i INT           -- index
  DECLARE @l INT           -- input length
  DECLARE @c NCHAR(1)      -- current char
  DECLARE @f INT           -- first letter flag (1/0)
  DECLARE @o VARCHAR(255)  -- output string
  DECLARE @w VARCHAR(10)   -- characters considered as white space

  SET @w = '[' + CHAR(13) + CHAR(10) + CHAR(9) + CHAR(160) + ' ' + ']'
  SET @i = 1
  SET @l = LEN(@string)
  SET @f = 1
  SET @o = ''

  WHILE @i <= @l
  BEGIN
    SET @c = SUBSTRING(@string, @i, 1)
    IF @f = 1 
    BEGIN
     SET @o = @o + @c
     SET @f = 0
    END
    ELSE
    BEGIN
     SET @o = @o + LOWER(@c)
    END

    IF @c LIKE @w SET @f = 1

    SET @i = @i + 1
  END

  RETURN @o
END

结果:

dbo.ToProperCase('ALL UPPER CASE and    SOME lower ÄÄ ÖÖ ÜÜ ÉÉ ØØ ĈĈ ÆÆ')
-----------------------------------------------------------------
All Upper Case and      Some lower Ää Öö Üü Éé Øø Cc Ææ

1
这绝对是最国际化的解决方案。它有我的投票权。这里唯一的假设是空格将单词分隔开。
Cervo

3
索引应该从1开始吗?第一个子字符串(,0,1)返回<empty>。我运行SQLSERVER2005

10
默认情况下,您可能应该将撇号作为空格字符,这样名称O'DONNELL不会更改为O'donnell
JustinStolle 2011年

2
@Tomalak @i变量应从1开始,否则输出前会加一个空格
Jakub

5
出色的小功能。这并不是说OP自找的,但如果有人想改变它,以免它不能忽略已经小写的话,并把它们转换为好,如“汤姆·庞巴迪”到“汤姆·庞巴迪”,只是改变这一行- SET @o = @o + @cSET @o = @o + UPPER(@c)。=)
NateJ

41
UPDATE titles
  SET title =
      UPPER(LEFT(title, 1)) +
        LOWER(RIGHT(title, LEN(title) - 1))

http://sqlmag.com/t-sql/how-title-case-column-value


8
仅供参考,这适用于单个单词值,但不适用于多个单词值。因此,“北卡罗莱纳州”变为“北卡罗莱纳州”,而不是预期的“北卡罗来纳州”。
molaro

4
+1是简单的单字解决方案,对我来说效果很好。唯一-如果title为空,则可能会出错。
塞格

@molaro进行空间分割,并分别处理每个单词。好的解决方案,但对可能性的长度有所限制。对于将来的观看者,可能希望拆分句子终止符,然后优先使用句子中的第一个单词。
GoldBishop'17年

1
添加WHERE title IS NOT NULL到最终解决@Serg的问题。
保罗

@Serg我编辑了代码,因此使用SUBSTRING而不是RIGHT
robotik


8

我知道这是该主题的最新文章,但值得一看。此功能对我有用。因此想共享它。

CREATE FUNCTION [dbo].[fnConvert_TitleCase] (@InputString VARCHAR(4000) )
RETURNS VARCHAR(4000)
AS
BEGIN
DECLARE @Index INT
DECLARE @Char CHAR(1)
DECLARE @OutputString VARCHAR(255)

SET @OutputString = LOWER(@InputString)
SET @Index = 2
SET @OutputString = STUFF(@OutputString, 1, 1,UPPER(SUBSTRING(@InputString,1,1)))

WHILE @Index <= LEN(@InputString)
BEGIN
    SET @Char = SUBSTRING(@InputString, @Index, 1)
    IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&','''','(')
    IF @Index + 1 <= LEN(@InputString)
BEGIN
    IF @Char != ''''
    OR
    UPPER(SUBSTRING(@InputString, @Index + 1, 1)) != 'S'
    SET @OutputString =
    STUFF(@OutputString, @Index + 1, 1,UPPER(SUBSTRING(@InputString, @Index + 1, 1)))
END
    SET @Index = @Index + 1
END

RETURN ISNULL(@OutputString,'')
END

测试电话:

select dbo.fnConvert_TitleCase(Upper('ÄÄ ÖÖ ÜÜ ÉÉ ØØ ĈĈ ÆÆ')) as test
select dbo.fnConvert_TitleCase(upper('Whatever the mind of man can conceive and believe, it can achieve. – Napoleon hill')) as test

结果:

在此处输入图片说明


您能描述为什么比Tomalak的ToProperCase函数stackoverflow.com/questions/230138/…更好吗?
Michael Freidgeim

1
根据此答案给出的示例以及Tomalak的内容以及Tomalak对其功能的描述(“仅保留小写单词”),此答案更好。我没有验证Tomalak的输入,但是此答案可以正确输入(据我的需要可以验证)。“适当的大小写是指每个单词的首字母大写的任何文本。” - computerhope.com/jargon/p/proper-case.htm
Morvael

8

我玩游戏有点晚了,但是我相信这是更实用的功能,并且可以与任何语言一起使用,包括俄语,德语,泰语,越南语等。它将在'或-或之后加上大写字母。或(或)或空格(显然是:)。

CREATE FUNCTION [dbo].[fnToProperCase]( @name nvarchar(500) )
RETURNS nvarchar(500)
AS
BEGIN
declare @pos    int = 1
      , @pos2   int

if (@name <> '')--or @name = lower(@name) collate SQL_Latin1_General_CP1_CS_AS or @name = upper(@name) collate SQL_Latin1_General_CP1_CS_AS)
begin
    set @name = lower(rtrim(@name))
    while (1 = 1)
    begin
        set @name = stuff(@name, @pos, 1, upper(substring(@name, @pos, 1)))
        set @pos2 = patindex('%[- ''.)(]%', substring(@name, @pos, 500))
        set @pos += @pos2
        if (isnull(@pos2, 0) = 0 or @pos > len(@name))
            break
    end
end

return @name
END
GO

除“ jack's house”变为“ Jack'S House”之外,此方法效果很好
Damien

2
杰克之家不是一个人的名字。奥布莱恩(O'Brian),奥康奈尔(O'Connell)是名字:)如果您不仅仅使用人们的名字,则需要进行更改。
Alansoft

3

如果您要在SSIS中导入大小写混合的数据,并且需要在具有适当大小写的列上进行查找,则会注意到在混合源和正确查找源的地方查找失败。您还会注意到,不能对SQL Server 2008r2的SSIS使用左右函数作为派生列。这是一个对我有用的解决方案:

UPPER(substring(input_column_name,1,1)) + LOWER(substring(input_column_name, 2, len(input_column_name)-1))

2

这是使用序列表或数字表而不是循环的版本。您可以修改WHERE子句以适合您的个人规则,以将字符转换为大写。我刚刚提供了一个简单的集合,该集合将大写由非字母开头的所有字母(撇号除外)。这确实意味着123apple将在“ a”上具有匹配项,因为“ 3”不是字母。如果你只想要空格(空格,制表符,回车,换行),可以更换模式'[^a-z]''[' + Char(32) + Char(9) + Char(13) + Char(10) + ']'


CREATE FUNCTION String.InitCap( @string nvarchar(4000) ) RETURNS nvarchar(4000) AS
BEGIN

-- 1. Convert all letters to lower case
    DECLARE @InitCap nvarchar(4000); SET @InitCap = Lower(@string);

-- 2. Using a Sequence, replace the letters that should be upper case with their upper case version
    SELECT @InitCap = Stuff( @InitCap, n, 1, Upper( SubString( @InitCap, n, 1 ) ) )
    FROM (
        SELECT (1 + n1.n + n10.n + n100.n + n1000.n) AS n
        FROM       (SELECT 0 AS n UNION SELECT    1 UNION SELECT    2 UNION SELECT    3 UNION SELECT    4 UNION SELECT    5 UNION SELECT    6 UNION SELECT    7 UNION SELECT    8 UNION SELECT    9) AS    n1
        CROSS JOIN (SELECT 0 AS n UNION SELECT   10 UNION SELECT   20 UNION SELECT   30 UNION SELECT   40 UNION SELECT   50 UNION SELECT   60 UNION SELECT   70 UNION SELECT   80 UNION SELECT   90) AS   n10
        CROSS JOIN (SELECT 0 AS n UNION SELECT  100 UNION SELECT  200 UNION SELECT  300 UNION SELECT  400 UNION SELECT  500 UNION SELECT  600 UNION SELECT  700 UNION SELECT  800 UNION SELECT  900) AS  n100
        CROSS JOIN (SELECT 0 AS n UNION SELECT 1000 UNION SELECT 2000 UNION SELECT 3000)                                                                                                             AS n1000
        ) AS Sequence
    WHERE 
        n BETWEEN 1 AND Len( @InitCap )
    AND SubString( @InitCap, n, 1 ) LIKE '[a-z]'                 /* this character is a letter */
    AND (
        n = 1                                                    /* this character is the first `character` */
        OR SubString( @InitCap, n-1, 1 ) LIKE '[^a-z]'           /* the previous character is NOT a letter */
        )
    AND (
        n < 3                                                    /* only test the 3rd or greater characters for this exception */
        OR SubString( @InitCap, n-2, 3 ) NOT LIKE '[a-z]''[a-z]' /* exception: The pattern <letter>'<letter> should not capatolize the letter following the apostrophy */
        )

-- 3. Return the modified version of the input
    RETURN @InitCap

END

1

我在上面发布的链接是解决主要问题的一个不错的选择:我们永远不能以编程方式解决所有情况(史密斯·琼斯,冯·豪森,约翰·史密斯医师),至少不能以一种优雅的方式。Tony引入了例外/中断字符的概念来处理这些情况。无论如何,基于Cervo的想法(所有低位字符前面加空格),replace语句可以包装在基于替换的单个表中。确实,任何低位/高位字符组合都可以插入到@alpha中,并且该语句不会更改:

declare @str    nvarchar(8000)
declare @alpha  table (low nchar(1), up nchar(1))


set @str = 'ALL UPPER CASE and    SOME lower ÄÄ ÖÖ ÜÜ ÉÉ ØØ ĈĈ ÆÆ'

-- stage the alpha (needs number table)
insert into @alpha
    -- A-Z / a-z
    select      nchar(n+32),
                nchar(n)
    from        dbo.Number
    where       n between 65 and 90 or
                n between 192 and 223

-- append space at start of str
set @str = lower(' ' + @str)

-- upper all lower case chars preceded by space
select  @str = replace(@str, ' ' + low, ' ' + up) 
from    @Alpha

select @str

另一个仅US-ASCII的解决方案。
Tomalak

您是否仍将其视为以美国为中心的解决方案,因为它引用了Unicode字符。我知道原始发布使用AZ ascii结果集,但是解决方案的要点是它是由表驱动的上,下字符的配对。replace语句仅引用该表。
内森·斯克尔

编辑:我更新了示例以使用您的示例输入。感谢您的任何反馈
Nathan Skerl,

是否存在“优雅”的方式来处理未连字符的大多数已知变体?像“ Mc”,“ O'C”一样,什么呢?
梅里特

1

维护异常查找以处理von Neumann,McCain,DeGuzman和Johnson-Smith这是很有意义的。


1

借用并改进了@Richard Sayakanit的答案。这处理多个单词。就像他的答案一样,它不使用任何UDF,仅使用内置函数(STRING_SPLITSTRING_AGG),并且速度非常快。STRING_AGG需要SQL Server 2017,但您可以随时使用该STUFF/XML技巧。不会处理所有异常,但可以满足许多要求。

SELECT StateName = 'North Carolina' 
INTO #States
UNION ALL
SELECT 'Texas'


;WITH cteData AS 
(
    SELECT 
        UPPER(LEFT(value, 1)) +
            LOWER(RIGHT(value, LEN(value) - 1)) value, op.StateName
    FROM   #States op
    CROSS APPLY STRING_SPLIT(op.StateName, ' ') AS ss
)
SELECT 
    STRING_AGG(value, ' ')
FROM cteData c 
GROUP BY StateName

1

对@Galwegian答案的稍作修改-例如St Elizabeth's变成St Elizabeth'S

此修改将撇号保持为小写字母,其中s出现在提供的字符串的末尾,或者s后跟一个空格(并且仅在那些情况下)。

create function properCase(@text as varchar(8000))
returns varchar(8000)
as
begin
    declare @reset int;
    declare @ret varchar(8000);
    declare @i int;
    declare @c char(1);
    declare @d char(1);

    if @text is null
    return null;

    select @reset = 1, @i = 1, @ret = '';

    while (@i <= len(@text))
    select
        @c = substring(@text, @i, 1),
        @d = substring(@text, @i+1, 1),
        @ret = @ret + case when @reset = 1 or (@reset=-1 and @c!='s') or (@reset=-1 and @c='s' and @d!=' ') then upper(@c) else lower(@c) end,
        @reset = case when @c like '[a-za-z]' then 0 when @c='''' then -1 else 1 end,
        @i = @i + 1
    return @ret
end

事实证明:

  • st elizabeth's 进入 St Elizabeth's
  • o'keefe 进入 O'Keefe
  • o'sullivan 进入 O'Sullivan

其他人的意见是,对于非英语输入,最好使用不同的解决方案。


0

我认为您会发现以下方法更有效:

IF OBJECT_ID('dbo.ProperCase') IS NOT NULL
    DROP FUNCTION dbo.ProperCase
GO
CREATE FUNCTION dbo.PROPERCASE (
    @str VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
    SET @str = ' ' + @str
    SET @str = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @str, ' a', ' A'), ' b', ' B'), ' c', ' C'), ' d', ' D'), ' e', ' E'), ' f', ' F'), ' g', ' G'), ' h', ' H'), ' i', ' I'), ' j', ' J'), ' k', ' K'), ' l', ' L'), ' m', ' M'), ' n', ' N'), ' o', ' O'), ' p', ' P'), ' q', ' Q'), ' r', ' R'), ' s', ' S'), ' t', ' T'), ' u', ' U'), ' v', ' V'), ' w', ' W'), ' x', ' X'), ' y', ' Y'), ' z', ' Z')
    RETURN RIGHT(@str, LEN(@str) - 1)
END
GO

可将replace语句剪切并直接粘贴到SQL查询中。这非常丑陋,但是通过将@str替换为您感兴趣的列,您将不会像使用这样发布的udfs那样为隐式游标付出代价。我发现即使使用我的UDF,效率也要高得多。

哦,而不是手动生成replace语句,请使用以下命令:

-- Code Generator for expression
DECLARE @x  INT,
    @c  CHAR(1),
    @sql    VARCHAR(8000)
SET @x = 0
SET @sql = '@str' -- actual variable/column you want to replace
WHILE @x < 26
BEGIN
    SET @c = CHAR(ASCII('a') + @x)
    SET @sql = 'REPLACE(' + @sql + ', '' ' + @c+  ''', '' ' + UPPER(@c) + ''')'
    SET @x = @x + 1
END
PRINT @sql

无论如何,这取决于行数。我希望您可以只做s / \ b([az])/ uc $ 1 /,但是哦,我们可以使用我们拥有的工具。

注意您将不得不使用它,就像您将它用作.... SELECT dbo.ProperCase(LOWER(column))一样,因为该列是大写的。实际上,在我的5,000个条目(甚至不到一秒钟)表上,即使使用较低的表,它也可以非常快地运行。

为了回应有关国际化的评论,我提出了以下实现,该实现仅依赖于SQL Server的上,下实现来处理每个ascii字符。记住,我们在这里使用的变量是VARCHAR,这意味着它们只能保存ASCII值。为了使用更多的国际字母,您必须使用NVARCHAR。逻辑类似,但是您将需要使用UNICODE和NCHAR代替ASCII AND CHAR,并且replace语句将大得多。

-- Code Generator for expression
DECLARE @x  INT,
    @c  CHAR(1),
    @sql    VARCHAR(8000),
    @count  INT
SEt @x = 0
SET @count = 0
SET @sql = '@str' -- actual variable you want to replace
WHILE @x < 256
BEGIN
    SET @c = CHAR(@x)
    -- Only generate replacement expression for characters where upper and lowercase differ
    IF @x = ASCII(LOWER(@c)) AND @x != ASCII(UPPER(@c))
    BEGIN
        SET @sql = 'REPLACE(' + @sql + ', '' ' + @c+  ''', '' ' + UPPER(@c) + ''')'
        SET @count = @count + 1
    END
    SET @x = @x + 1
END
PRINT @sql
PRINT 'Total characters substituted: ' + CONVERT(VARCHAR(255), @count)

基本上,我的方法的前提是为了提高效率而进行预计算。完整的ASCII实现如下:

IF OBJECT_ID('dbo.ProperCase') IS NOT NULL
    DROP FUNCTION dbo.ProperCase
GO
CREATE FUNCTION dbo.PROPERCASE (
    @str VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
    SET @str = ' ' + @str
SET @str =     REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@str, ' a', ' A'), ' b', ' B'), ' c', ' C'), ' d', ' D'), ' e', ' E'), ' f', ' F'), ' g', ' G'), ' h', ' H'), ' i', ' I'), ' j', ' J'), ' k', ' K'), ' l', ' L'), ' m', ' M'), ' n', ' N'), ' o', ' O'), ' p', ' P'), ' q', ' Q'), ' r', ' R'), ' s', ' S'), ' t', ' T'), ' u', ' U'), ' v', ' V'), ' w', ' W'), ' x', ' X'), ' y', ' Y'), ' z', ' Z'), ' š', ' Š'), ' œ', ' Œ'), ' ž', ' Ž'), ' à', ' À'), ' á', ' Á'), ' â', ' Â'), ' ã', ' Ã'), ' ä', ' Ä'), ' å', ' Å'), ' æ', ' Æ'), ' ç', ' Ç'), ' è', ' È'), ' é', ' É'), ' ê', ' Ê'), ' ë', ' Ë'), ' ì', ' Ì'), ' í', ' Í'), ' î', ' Î'), ' ï', ' Ï'), ' ð', ' Ð'), ' ñ', ' Ñ'), ' ò', ' Ò'), ' ó', ' Ó'), ' ô', ' Ô'), ' õ', ' Õ'), ' ö', ' Ö'), ' ø', ' Ø'), ' ù', ' Ù'), ' ú', ' Ú'), ' û', ' Û'), ' ü', ' Ü'), ' ý', ' Ý'), ' þ', ' Þ'), ' ÿ', ' Ÿ')
    RETURN RIGHT(@str, LEN(@str) - 1)
END
GO

1
是的 您的字母只有26个字符。我的还有更多。希腊呢?还是土耳其语?
Tomalak

我认为其他解决方案也一样。但是我已经包含了代码生成器。您可以为字母添加其他部分。您必须将所有内容都设置为NVARCHAR,并使用NCHAR和UNICODE进行转换。
Cervo

我认为您使用的字符越多,效率就会越低。但是,某些字符集中的每个符号代表一个完整的单词,因此整个大小写问题都不适用....
Cervo

我也怀疑有人一次使用每个unicode字符。因此,可能只是代码生成了您使用的2或3个字母的替换。
Cervo

1
这并不意味着您应该仅使用半熟的仅英语的解决方案,因为您希望数据“可能在您的字母中”。就拉丁文书写系统而言,(几乎)任何字符都有小写/大写定义。转换功能更多地是关于正确性而不是速度。
Tomalak

0

返回获取未大写的数据是否为时已晚?

客户群的冯·诺依曼,麦凯恩,德古兹曼和约翰逊·史密斯可能不喜欢您处理的结果...

另外,我猜想这是对数据的一次性升级吗?将更正后的名称导出,过滤/修改和重新导入到数据库中可能会更容易,然后您可以使用非SQL方法进行名称固定...


讨论时,整个命名问题可能会带来不利影响-没有迹象表明问题作者引用了包含名称的数据。
Tomalak

0

这是我在SQLTeam.com论坛@ http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=47718上找到的另一个变体

create FUNCTION PROPERCASE
(
--The string to be converted to proper case
@input varchar(8000)
)
--This function returns the proper case string of varchar type
RETURNS varchar(8000)
AS
BEGIN
IF @input IS NULL
BEGIN
--Just return NULL if input string is NULL
RETURN NULL
END

--Character variable declarations
DECLARE @output varchar(8000)
--Integer variable declarations
DECLARE @ctr int, @len int, @found_at int
--Constant declarations
DECLARE @LOWER_CASE_a int, @LOWER_CASE_z int, @Delimiter char(3), @UPPER_CASE_A int, @UPPER_CASE_Z int

--Variable/Constant initializations
SET @ctr = 1
SET @len = LEN(@input)
SET @output = ''
SET @LOWER_CASE_a = 97
SET @LOWER_CASE_z = 122
SET @Delimiter = ' ,-'
SET @UPPER_CASE_A = 65
SET @UPPER_CASE_Z = 90

WHILE @ctr <= @len
BEGIN
--This loop will take care of reccuring white spaces
WHILE CHARINDEX(SUBSTRING(@input,@ctr,1), @Delimiter) > 0
BEGIN
SET @output = @output + SUBSTRING(@input,@ctr,1)
SET @ctr = @ctr + 1
END

IF ASCII(SUBSTRING(@input,@ctr,1)) BETWEEN @LOWER_CASE_a AND @LOWER_CASE_z
BEGIN
--Converting the first character to upper case
SET @output = @output + UPPER(SUBSTRING(@input,@ctr,1))
END
ELSE
BEGIN
SET @output = @output + SUBSTRING(@input,@ctr,1)
END

SET @ctr = @ctr + 1

WHILE CHARINDEX(SUBSTRING(@input,@ctr,1), @Delimiter) = 0 AND (@ctr <= @len)
BEGIN
IF ASCII(SUBSTRING(@input,@ctr,1)) BETWEEN @UPPER_CASE_A AND @UPPER_CASE_Z
BEGIN
SET @output = @output + LOWER(SUBSTRING(@input,@ctr,1))
END
ELSE
BEGIN
SET @output = @output + SUBSTRING(@input,@ctr,1)
END
SET @ctr = @ctr + 1
END

END
RETURN @output
END



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

0

我知道细节在于魔鬼(特别是在涉及人们的个人数据的地方),并且适当地使用大写的名字将是非常好的,但是上述麻烦是我们当中务实,有时间意识的人使用以下内容的原因:

SELECT UPPER('Put YoUR O'So oddLy casED McWeird-nAme von rightHERE here')

以我的经验,即使在句子的一半时,人们也能很好地看到他们的名字。

参考:俄罗斯人用铅笔!


3
拒绝该问题没有帮助。此“答案”是最好的评论。
菲尔

0

刚刚了解 InitCap()

这是一些示例代码:

SELECT ID
      ,InitCap(LastName ||', '|| FirstName ||' '|| Nvl(MiddleName,'')) AS RecipientName
FROM SomeTable

2
OP指定的Sql Server,“ InitCap()”是Oracle的东西。
mxmissile

0

这在SSMS中起作用:

Select Jobtitle,
concat(Upper(LEFT(jobtitle,1)), SUBSTRING(jobtitle,2,LEN(jobtitle))) as Propercase
From [HumanResources].[Employee]

0

如果您知道所有数据只是一个字,那么这里就是一个解决方案。首先将列更新为最低,然后运行以下命令

    update tableName set columnName = 
    upper(SUBSTRING(columnName, 1, 1)) + substring(columnName, 2, len(columnName)) from tableName

0

最近,我不得不解决这个问题,并提出了以下建议,但没有遇到任何我想要的东西。这将处理整个句子,并进行特殊的单词处理。我们还遇到了许多简单方法无法处理的单字符“单词”问题,而更复杂的方法无法解决的问题。单返回变量,无循环或游标。

CREATE FUNCTION ProperCase(@Text AS NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS BEGIN

    DECLARE @return NVARCHAR(MAX)

    SELECT @return = COALESCE(@return + ' ', '') + Word FROM (
         SELECT CASE
            WHEN LOWER(value) = 'llc' THEN UPPER(value)
            WHEN LOWER(value) = 'lp' THEN UPPER(value) --Add as many new special cases as needed
            ELSE
               CASE WHEN LEN(value) = 1
               THEN UPPER(value)
               ELSE UPPER(LEFT(value, 1)) + (LOWER(RIGHT(value, LEN(value) - 1)))
              END
            END AS Word
         FROM STRING_SPLIT(@Text, ' ')
     ) tmp

     RETURN @return
END

0

将数据复制并粘贴到MS Word中,并使用内置的文本转换功能“将每个Word大写”。与原始数据进行比较以解决异常情况。看不到手动回避“ MacDonald”和“ IBM”类型异常的任何方法,但这是我通过FWIW完成的方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.