2008-09-10 5 views
34

Каков наилучший способ заглавной буквы первой буквы каждого слова в строке в SQL Server.Каков наилучший способ заглавной буквы первой буквы каждого слова в строке в SQL Server

+0

ли это сделать в SQL Server? Это не то, что я бы связал с сервером базы данных, а что-то сделанное путем проверки формы или даже представления. – 2008-09-10 19:09:31

+0

Пользователи PostgreSQL: UPDATE [таблица] SET your_col = initcap (lower (your_col)); Это не вопрос Postgre, но он появляется сначала в google независимо. – 2013-10-10 14:38:37

ответ

64

От 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

+0

Что означает UPPER (@Char)! = 'S'? почему мы это используем? – Sharique 2010-06-16 05:32:47

+1

Сравнение с 'S' состоит в том, чтобы убедиться, что S не заглавная при написании слов типа `that's` – Espo 2011-02-11 13:47:48

+0

Спасибо, это мне помогло!) – 2012-07-02 09:01:13

0

Разновидностью один я использую в течение довольно продолжительного времени:

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 

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

1

Другое решение без использования цикла - чистый подход на основе набора с рекурсивной КТР

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 
0

Здесь это самый простой код в одну строку.

select 
     LEFT(column, 1)+ lower(RIGHT(column, len(column)-1)) 
    from [tablename] 
-1

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

Select INITCAP(column_name) from table_name; 

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

0

В таблице-функции:

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

Смежные вопросы