SQL Server:将所有UPPER案例设置为正确的案例/标题案例

Rya*_*ter 86 sql sql-server title-case uppercase

我有一个表作为所有UPPER CASE导入,我想把它变成正确的案例.你们有什么脚本用来完成这个?

Tom*_*lak 101

这个功能:

  • "正确案例"所有由白色空间划分的"大写"字样
  • 单独留下"小写字"
  • 即使对于非英文字母也能正常工作
  • 是可移植的,因为它不使用最新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
Run Code Online (Sandbox Code Playgroud)

结果:

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

  • 你应该在默认情况下包含一个撇号作为空白字符,所以像'O'DONNELL`这样的名字不会改为'O'donnell`. (10认同)
  • 优秀的小功能.并不是OP要求它,但是如果有人想改变它以便它*不*忽略已经小写的单词,并将它们转换为例如"tom bombadil"到"Tom Bombadil",只需改变这个一行 - "SET @o = @o + @c`到'SET @o = @o + UPPER(@c)`.=) (5认同)
  • 索引应该从1开始吗?第一个子字符串(,0,1)返回<empty>.我正在运行sqlserver2005 (3认同)
  • @Tomalak @i变量应该从1开始,否则在输出前面加一个空格 (2认同)

Gal*_*ian 77

这是一个可以解决问题的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
Run Code Online (Sandbox Code Playgroud)

您仍然必须使用它来更新您的数据.

  • 这会打击非英语输入. (15认同)
  • 尝试使用SQL Server 2008和所有类型的重音,就像一个魅力.这实际上取决于整理 (2认同)

小智 37

UPDATE titles
  SET title =
      UPPER(LEFT(title, 1)) +
        LOWER(RIGHT(title, LEN(title) - 1))
Run Code Online (Sandbox Code Playgroud)

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

  • 仅供参考,这适用于单个单词值,但不适用于多个单词值.所以"北卡罗来纳州"变成"北卡罗莱纳州"而不是被执行的"北卡罗莱纳州". (8认同)
  • +1作为简单的单字解决方案,对我来说效果很好.唯一的 - 如果`title`为空,你会得到错误. (3认同)
  • 在末尾添加`WHERE title IS NOT NULL` 以解决@Serg 的问题。 (2认同)

Gre*_*ech 17

如果您可以在SQL Server中启用CLR(需要2005或更高版本),那么您可以创建一个CLR函数,该函数使用TextInfo.ToTitleCase内置函数,这将允许您创建一种文化感知方式,只需几个代码行.


Ala*_*oft 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
Run Code Online (Sandbox Code Playgroud)

  • 杰克之家不是一个人的名字。奥布莱恩 (O'Brian)、奥康奈尔 (O'Connell) 都是名字:) 如果您不专门处理人的名字,则有必要进行更改。 (2认同)
  • 不过,杰克之家很容易成为一家企业的名称。 (2认同)

小智 7

我知道这是在这个帖子中的后期但是,值得一看.这个功能对我有用.所以想分享它.

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
Run Code Online (Sandbox Code Playgroud)

测试电话:

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
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述


cry*_*tik 6

在 Server Server 2016 及更高版本上,您可以使用STRING_SPLIT


with t as (
    select 'GOOFYEAR Tire and Rubber Company' as n
    union all
    select 'THE HAPPY BEAR' as n
    union all
    select 'MONK HOUSE SALES' as n
    union all
    select 'FORUM COMMUNICATIONS' as n
)
select
    n,
    (
        select ' ' + (
            upper(left(value, 1))
            + lower(substring(value, 2, 999))
        )
        from (
            select value
            from string_split(t.n, ' ')
        ) as sq
        for xml path ('')
    ) as title_cased
from t
Run Code Online (Sandbox Code Playgroud)

例子


小智 5

如果您在 SSIS 中导入混合大小写的数据并且需要对大小写正确的列进行查找,您会注意到在源混合且查找源正确的情况下查找失败。您还会注意到,您无法将 SSIS for SQL Server 2008r2 的 right 和 left 函数用于派生列。这是一个适合我的解决方案:

UPPER(substring(input_column_name,1,1)) + LOWER(substring(input_column_name, 2, len(input_column_name)-1))
Run Code Online (Sandbox Code Playgroud)