SQL Server капитализирует каждую первую букву каждого слова с помощью цикла [duplicate]

По вопросу «что мне делать с этим» может быть много ответов.

Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .

Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.

Таким образом, вы можете избежать случаев NullReferenceException, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X в классе, а затем попытаетесь вызвать один из его методов, а X имеет нулевое значение, то это приведет к NullReferenceException:

public X { get; set; }

public void InvokeX()
{
    X.DoSomething(); // if X value is null, you will get a NullReferenceException
}

Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:

//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant () 
{
    Contract.Invariant ( X != null );
    //...
}

По этой причине Код Контракт существует для приложений .NET.

В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

40
задан Magpie 10 September 2008 в 20:07
поделиться

8 ответов

Из http://www.sql-server-helper.com/functions/initcap.aspx

CREATE FUNCTION [dbo].[InitCap] ( @InputString varchar(4000) ) 
RETURNS VARCHAR(4000)
AS
BEGIN

DECLARE @Index          INT
DECLARE @Char           CHAR(1)
DECLARE @PrevChar       CHAR(1)
DECLARE @OutputString   VARCHAR(255)

SET @OutputString = LOWER(@InputString)
SET @Index = 1

WHILE @Index <= LEN(@InputString)
BEGIN
    SET @Char     = SUBSTRING(@InputString, @Index, 1)
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' '
                         ELSE SUBSTRING(@InputString, @Index - 1, 1)
                    END

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

    SET @Index = @Index + 1
END

RETURN @OutputString

END
GO

Здесь есть более простой / меньший (но не работает, если в какой-либо строке нет пробелов, «Недопустимый параметр длины передан в функцию« ПРАВО ».):

http://www.devx.com/tips/Tip/ 17608

64
ответ дан Community 1 September 2018 в 07:15
поделиться
  • 1
    что означает UPPER (@Char)! = 'S'? почему мы это используем? – Sharique 16 June 2010 в 06:32
  • 2
    Сравнение с «S» заключается в том, чтобы убедиться, что S не капитализируется при написании таких слов, как that's – Espo 11 February 2011 в 14:47
  • 3
    Спасибо, это помогло мне! ) – Serhiy Prysyazhnyy 2 July 2012 в 10:01
  • 4
    спасибо @epso, который работал как шарм – Devjosh 14 February 2013 в 09:41
  • 5
    Функция работает медленно, но работает правильно. Как повысить производительность? – Marek Bar 14 May 2015 в 07:55

Вот простейший однострочный код.

select 
        LEFT(column, 1)+ lower(RIGHT(column, len(column)-1) )
     from [tablename]
0
ответ дан Amrik 1 September 2018 в 07:15
поделиться
  • 1
    Обратите внимание, что каждый столбец должен быть обрезан пробелом или этот разрыв. – JohnnyBizzle 25 August 2015 в 14:19
  • 2
    Кроме того, вы не делаете Upper на первой букве. – JohnnyBizzle 25 August 2015 в 14:25
  • 3
    Это только заглавные буквы первой буквы столбца – slayernoah 9 April 2016 в 01:13
  • 4
    @Amrik Как сказал @JohnnyBizzle выше, я думаю, вы имели в виду следующее: select UPPER(LEFT(column, 1)) + lower(RIGHT(column, len(column)-1) ) from [tablename] – nam 10 September 2017 в 16:12

Другое решение без использования метода loop-pure set-based с рекурсивным CTE

create function [dbo].InitCap (@value varchar(max))
returns varchar(max) as
begin

    declare
        @separator char(1) = ' ',
        @result varchar(max) = '';

    with r as (
        select value, cast(null as varchar(max)) [x], cast('' as varchar(max)) [char], 0 [no] from (select rtrim(cast(@value as varchar(max))) [value]) as j
        union all
        select right(value, len(value)-case charindex(@separator, value) when 0 then len(value) else charindex(@separator, value) end) [value]
        , left(r.[value], case charindex(@separator, r.value) when 0 then len(r.value) else abs(charindex(@separator, r.[value])-1) end ) [x]
        , left(r.[value], 1)
        , [no] + 1 [no]
        from r where value > '')

    select @result = @result +
    case
        when ascii([char]) between 97 and 122 
            then stuff(x, 1, 1, char(ascii([char])-32))
        else x
    end + @separator
    from r where x is not null;

    set @result = rtrim(@result);

    return @result;
end
1
ответ дан Andrey Morozov 1 September 2018 в 07:15
поделиться

Вариант того, который я использовал в течение довольно продолжительного времени, это:

CREATE FUNCTION [widget].[properCase](@string varchar(8000)) RETURNS varchar(8000) AS
BEGIN   
    SET @string = LOWER(@string)
    DECLARE @i INT
    SET @i = ASCII('a')
    WHILE @i <= ASCII('z')
    BEGIN
        SET @string = REPLACE( @string, ' ' + CHAR(@i), ' ' + CHAR(@i-32))
        SET @i = @i + 1
    END
    SET @string = CHAR(ASCII(LEFT(@string, 1))-32) + RIGHT(@string, LEN(@string)-1)
    RETURN @string
END

Вы можете легко изменить для обработки символов после элементов, отличных от пробелов, если хотите.

0
ответ дан Josef 1 September 2018 в 07:15
поделиться

В качестве табличной функции:

CREATE FUNCTION dbo.InitCap(@v AS VARCHAR(MAX))
RETURNS TABLE
AS
RETURN 
WITH a AS (
    SELECT (
        SELECT UPPER(LEFT(value, 1)) + LOWER(SUBSTRING(value, 2, LEN(value))) AS 'data()'
        FROM string_split(@v, ' ')
        FOR XML PATH (''), TYPE) ret)

SELECT CAST(a.ret AS varchar(MAX)) ret from a
GO

Обратите внимание, что для string_split требуется COMPATIBILITY_LEVEL 130.

0
ответ дан Kristofer 1 September 2018 в 07:15
поделиться
BEGIN
DECLARE @string varchar(100) = 'asdsadsd asdad asd'
DECLARE @ResultString varchar(200) = ''
DECLARE @index int = 1
DECLARE @flag bit = 0
DECLARE @temp varchar(2) = ''
WHILE (@Index <LEN(@string)+1)
BEGIN
    SET @temp = SUBSTRING(@string, @Index-1, 1)
    --select @temp
    IF @temp = ' ' OR @index = 1
        BEGIN
            SET @ResultString = @ResultString + UPPER(SUBSTRING(@string, @Index, 1))
        END
    ELSE
        BEGIN

            SET @ResultString = @ResultString + LOWER(SUBSTRING(@string, @Index, 1)) 
        END 

    SET @Index = @Index+ 1--increase the index
END
SELECT @ResultString

END

0
ответ дан Vignesh Sonaiya 1 September 2018 в 07:15
поделиться
  • 1
    Очень простой способ заглавной буквы первого символа в SQL Server – Vignesh Sonaiya 11 December 2017 в 15:00

Вы должны попробовать это вместо

Select INITCAP(column_name) from table_name;

Это будет заглавная буква первой буквы указанных атрибутов.

-1
ответ дан Bhargav Rao 1 September 2018 в 07:15
поделиться
  • 1
    & Quot; INITCAP & Quot; не является встроенной функцией - вам нужно предоставить определение функции. – chazbot7 30 September 2016 в 20:37
  • 2
    Я использую INITCAP в Oracle MYSQL, и он отлично работает – GOLDY AGARWAL 11 October 2016 в 04:21
  • 3
    Да, но вопрос конкретно указывает SQL Server. – chazbot7 12 October 2016 в 00:03

Только для данных на английском языке.

Суперэффективен с точки зрения производительности, но эффективен с точки зрения производительности. Используйте его как одноразовый конвертер:

SELECT 
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(

UPPER(LEFT(City,1))+LOWER(SUBSTRING(City,2,LEN(City)))

,' 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')


FROM [Dictionaries].[dbo].[Cities]
  WHERE Country = 'US' AND City like '% %'
  ORDER BY City
0
ответ дан Roman M 1 September 2018 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: